1 // Copyright 2024 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "base/android/android_input_receiver_compat.h"
6
7 #include <dlfcn.h>
8
9 #include "base/android/build_info.h"
10 #include "base/check.h"
11 #include "base/logging.h"
12
13 namespace base {
14
AndroidInputReceiverCompat()15 AndroidInputReceiverCompat::AndroidInputReceiverCompat() {
16 DCHECK(IsSupportAvailable());
17
18 void* main_dl_handle = dlopen("libandroid.so", RTLD_NOW);
19 if (!main_dl_handle) {
20 LOG(ERROR) << "Couldnt load android so";
21 return;
22 }
23
24 *reinterpret_cast<void**>(&AInputTransferToken_fromJavaFn) =
25 dlsym(main_dl_handle, "AInputTransferToken_fromJava");
26 DCHECK(AInputTransferToken_fromJavaFn);
27
28 *reinterpret_cast<void**>(&AInputTransferToken_toJavaFn) =
29 dlsym(main_dl_handle, "AInputTransferToken_toJava");
30 DCHECK(AInputTransferToken_toJavaFn);
31
32 *reinterpret_cast<void**>(&AInputTransferToken_releaseFn) =
33 dlsym(main_dl_handle, "AInputTransferToken_release");
34 DCHECK(AInputTransferToken_releaseFn);
35
36 *reinterpret_cast<void**>(&AInputEvent_toJavaFn) =
37 dlsym(main_dl_handle, "AInputEvent_toJava");
38 DCHECK(AInputEvent_toJavaFn);
39
40 *reinterpret_cast<void**>(&AInputReceiverCallbacks_createFn) =
41 dlsym(main_dl_handle, "AInputReceiverCallbacks_create");
42 DCHECK(AInputReceiverCallbacks_createFn);
43
44 *reinterpret_cast<void**>(&AInputReceiverCallbacks_releaseFn) =
45 dlsym(main_dl_handle, "AInputReceiverCallbacks_release");
46 DCHECK(AInputReceiverCallbacks_releaseFn);
47
48 *reinterpret_cast<void**>(&AInputReceiverCallbacks_setMotionEventCallbackFn) =
49 dlsym(main_dl_handle, "AInputReceiverCallbacks_setMotionEventCallback");
50 DCHECK(AInputReceiverCallbacks_setMotionEventCallbackFn);
51
52 *reinterpret_cast<void**>(&AInputReceiver_createUnbatchedInputReceiverFn) =
53 dlsym(main_dl_handle, "AInputReceiver_createUnbatchedInputReceiver");
54 DCHECK(AInputReceiver_createUnbatchedInputReceiverFn);
55
56 *reinterpret_cast<void**>(&AInputReceiver_getInputTransferTokenFn) =
57 dlsym(main_dl_handle, "AInputReceiver_getInputTransferToken");
58 DCHECK(AInputReceiver_getInputTransferTokenFn);
59
60 *reinterpret_cast<void**>(&AInputReceiver_releaseFn) =
61 dlsym(main_dl_handle, "AInputReceiver_release");
62 DCHECK(AInputReceiver_releaseFn);
63 }
64
65 // static
IsSupportAvailable()66 bool AndroidInputReceiverCompat::IsSupportAvailable() {
67 return base::android::BuildInfo::GetInstance()->sdk_int() >=
68 base::android::SDK_VERSION_V;
69 }
70
71 // static
GetInstance()72 const AndroidInputReceiverCompat& AndroidInputReceiverCompat::GetInstance() {
73 static AndroidInputReceiverCompat compat;
74 return compat;
75 }
76
77 } // namespace base
78