Skip to content

Commit 97b87da

Browse files
authored
Revert "Revert "[BinderTransport] Allow finding Java class using custom class finder (grpc#28348)" (grpc#28496)" (grpc#28508)
* Revert "Revert "[BinderTransport] Allow finding Java class using custom class finder (grpc#28348)" (grpc#28496)" This reverts commit ecf6a7f. * Add missing include directives
1 parent ded999b commit 97b87da

File tree

4 files changed

+42
-2
lines changed

4 files changed

+42
-2
lines changed

include/grpcpp/create_channel_binder.h

+9
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,15 @@ std::shared_ptr<grpc::Channel> CreateCustomBinderChannel(
7878
/// Returns true when the initialization is successful.
7979
bool InitializeBinderChannelJavaClass(void* jni_env_void);
8080

81+
/// EXPERIMENTAL Alternative version of `InitializeBinderChannelJavaClass(void*
82+
/// jni_env_void)`. This version used a user-specified function to find the
83+
/// required internal Java class. When a class is found, the `class_finder`
84+
/// function should return a local reference to the class (jclass type). The
85+
/// returned jclass will then be used to create global reference for gRPC to use
86+
/// it later. After that, gRPC will DeleteLocalRef the returned local reference.
87+
bool InitializeBinderChannelJavaClass(
88+
void* jni_env_void, std::function<void*(std::string)> class_finder);
89+
8190
} // namespace experimental
8291
} // namespace grpc
8392

src/core/ext/transport/binder/client/channel_create.cc

+17
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
#include "src/core/ext/transport/binder/wire_format/binder.h"
5151
#include "src/core/ext/transport/binder/wire_format/binder_android.h"
5252
#include "src/core/lib/channel/channel_args.h"
53+
#include "src/core/lib/config/core_configuration.h"
5354
#include "src/core/lib/surface/channel.h"
5455
#include "src/core/lib/transport/transport.h"
5556
#include "src/cpp/client/create_channel_internal.h"
@@ -122,6 +123,12 @@ bool InitializeBinderChannelJavaClass(void* jni_env_void) {
122123
static_cast<JNIEnv*>(jni_env_void)) != nullptr;
123124
}
124125

126+
bool InitializeBinderChannelJavaClass(
127+
void* jni_env_void, std::function<void*(std::string)> class_finder) {
128+
return grpc_binder::FindNativeConnectionHelper(
129+
static_cast<JNIEnv*>(jni_env_void), class_finder) != nullptr;
130+
}
131+
125132
} // namespace experimental
126133
} // namespace grpc
127134

@@ -162,6 +169,16 @@ bool InitializeBinderChannelJavaClass(void* jni_env_void) {
162169
return {};
163170
}
164171

172+
bool InitializeBinderChannelJavaClass(
173+
void* jni_env_void, std::function<void*(std::string)> class_finder) {
174+
gpr_log(GPR_ERROR,
175+
"This APK is compiled with Android API level = %d, which is not "
176+
"supported. See port_platform.h for supported versions.",
177+
__ANDROID_API__);
178+
GPR_ASSERT(0);
179+
return {};
180+
}
181+
165182
} // namespace experimental
166183
} // namespace grpc
167184

src/core/ext/transport/binder/client/jni_utils.cc

+10-2
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,20 @@
2525
namespace grpc_binder {
2626

2727
jclass FindNativeConnectionHelper(JNIEnv* env) {
28-
auto do_find = [env]() {
29-
jclass cl = env->FindClass("io/grpc/binder/cpp/NativeConnectionHelper");
28+
return FindNativeConnectionHelper(
29+
env, [env](std::string cl) { return env->FindClass(cl.c_str()); });
30+
}
31+
32+
jclass FindNativeConnectionHelper(
33+
JNIEnv* env, std::function<void*(std::string)> class_finder) {
34+
auto do_find = [env, class_finder]() {
35+
jclass cl = static_cast<jclass>(
36+
class_finder("io/grpc/binder/cpp/NativeConnectionHelper"));
3037
if (cl == nullptr) {
3138
return cl;
3239
}
3340
jclass global_cl = static_cast<jclass>(env->NewGlobalRef(cl));
41+
env->DeleteLocalRef(cl);
3442
GPR_ASSERT(global_cl != nullptr);
3543
return global_cl;
3644
};

src/core/ext/transport/binder/client/jni_utils.h

+6
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@
2121

2222
#include <jni.h>
2323

24+
#include <functional>
25+
#include <string>
26+
2427
#include "absl/strings/string_view.h"
2528

2629
namespace grpc_binder {
@@ -31,6 +34,9 @@ namespace grpc_binder {
3134
// JNI_OnLoad) so subsequent BinderTransport code can find Java class
3235
jclass FindNativeConnectionHelper(JNIEnv* env);
3336

37+
jclass FindNativeConnectionHelper(
38+
JNIEnv* env, std::function<void*(std::string)> class_finder);
39+
3440
// Calls Java method NativeConnectionHelper.tryEstablishConnection
3541
void TryEstablishConnection(JNIEnv* env, jobject application,
3642
absl::string_view pkg, absl::string_view cls,

0 commit comments

Comments
 (0)