19 #ifndef GRPC_NO_BINDER
21 #ifdef GPR_SUPPORT_BINDER_TRANSPORT
31 void* GetNdkBinderHandle() {
34 static void*
handle = dlopen(
"libbinder_ndk.so", RTLD_LAZY);
38 "Cannot open libbinder_ndk.so. Does this device support API level 29?");
44 JavaVM* g_jvm =
nullptr;
51 void SetJvm(JNIEnv*
env) {
55 if (g_jvm !=
nullptr) {
58 JavaVM* jvm =
nullptr;
60 if (
error != JNI_OK) {
72 if (g_is_jvm_attached) {
77 if (g_jvm ==
nullptr) {
84 g_jvm->AttachCurrentThread(&env_unused,
nullptr);
86 g_is_jvm_attached =
true;
96 #define FORWARD(name) \
97 typedef decltype(&name) func_type; \
98 static func_type ptr = \
99 reinterpret_cast<func_type>(dlsym(GetNdkBinderHandle(), #name)); \
100 if (ptr == nullptr) { \
102 "dlsym failed. Cannot find %s in libbinder_ndk.so. " \
103 "BinderTransport requires API level >= 33", \
109 void AIBinder_Class_disableInterfaceTokenHeader(AIBinder_Class* clazz) {
110 FORWARD(AIBinder_Class_disableInterfaceTokenHeader)(clazz);
113 void* AIBinder_getUserData(AIBinder* binder) {
114 FORWARD(AIBinder_getUserData)(binder);
117 uid_t AIBinder_getCallingUid() { FORWARD(AIBinder_getCallingUid)(); }
119 AIBinder* AIBinder_fromJavaBinder(JNIEnv*
env, jobject binder) {
121 FORWARD(AIBinder_fromJavaBinder)(
env, binder);
124 AIBinder_Class* AIBinder_Class_define(
const char* interfaceDescriptor,
125 AIBinder_Class_onCreate onCreate,
126 AIBinder_Class_onDestroy onDestroy,
127 AIBinder_Class_onTransact onTransact) {
128 FORWARD(AIBinder_Class_define)
129 (interfaceDescriptor, onCreate, onDestroy, onTransact);
132 AIBinder* AIBinder_new(
const AIBinder_Class* clazz,
void*
args) {
133 FORWARD(AIBinder_new)(clazz,
args);
136 bool AIBinder_associateClass(AIBinder* binder,
const AIBinder_Class* clazz) {
137 FORWARD(AIBinder_associateClass)(binder, clazz);
140 void AIBinder_incStrong(AIBinder* binder) {
141 FORWARD(AIBinder_incStrong)(binder);
144 void AIBinder_decStrong(AIBinder* binder) {
145 FORWARD(AIBinder_decStrong)(binder);
149 AParcel**
in, AParcel**
out,
150 binder_flags_t
flags) {
157 binder_status_t AParcel_readByteArray(
const AParcel* parcel,
void* arrayData,
158 AParcel_byteArrayAllocator allocator) {
159 FORWARD(AParcel_readByteArray)(parcel, arrayData, allocator);
162 void AParcel_delete(AParcel* parcel) { FORWARD(AParcel_delete)(parcel); }
163 int32_t AParcel_getDataSize(
const AParcel* parcel) {
164 FORWARD(AParcel_getDataSize)(parcel);
167 binder_status_t AParcel_writeInt32(AParcel* parcel,
int32_t value) {
168 FORWARD(AParcel_writeInt32)(parcel,
value);
171 binder_status_t AParcel_writeInt64(AParcel* parcel,
int64_t value) {
172 FORWARD(AParcel_writeInt64)(parcel,
value);
175 binder_status_t AParcel_writeStrongBinder(AParcel* parcel, AIBinder* binder) {
176 FORWARD(AParcel_writeStrongBinder)(parcel, binder);
179 binder_status_t AParcel_writeString(AParcel* parcel,
const char*
string,
184 binder_status_t AParcel_readInt32(
const AParcel* parcel,
int32_t*
value) {
185 FORWARD(AParcel_readInt32)(parcel,
value);
188 binder_status_t AParcel_readInt64(
const AParcel* parcel,
int64_t*
value) {
189 FORWARD(AParcel_readInt64)(parcel,
value);
192 binder_status_t AParcel_readString(
const AParcel* parcel,
void* stringData,
193 AParcel_stringAllocator allocator) {
194 FORWARD(AParcel_readString)(parcel, stringData, allocator);
197 binder_status_t AParcel_readStrongBinder(
const AParcel* parcel,
199 FORWARD(AParcel_readStrongBinder)(parcel, binder);
202 binder_status_t AParcel_writeByteArray(AParcel* parcel,
const int8_t* arrayData,
204 FORWARD(AParcel_writeByteArray)(parcel, arrayData,
length);
207 binder_status_t AIBinder_prepareTransaction(AIBinder* binder, AParcel**
in) {
208 FORWARD(AIBinder_prepareTransaction)(binder,
in);
211 jobject AIBinder_toJavaBinder(JNIEnv*
env, AIBinder* binder) {
213 FORWARD(AIBinder_toJavaBinder)(
env, binder);