xref: /aosp_15_r20/external/grpc-grpc/spm-cpp-include/grpcpp/create_channel_binder.h (revision cc02d7e222339f7a4f6ba5f422e6413f4bd931f2)
1*cc02d7e2SAndroid Build Coastguard Worker // Copyright 2021 gRPC authors.
2*cc02d7e2SAndroid Build Coastguard Worker //
3*cc02d7e2SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*cc02d7e2SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*cc02d7e2SAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*cc02d7e2SAndroid Build Coastguard Worker //
7*cc02d7e2SAndroid Build Coastguard Worker //     http://www.apache.org/licenses/LICENSE-2.0
8*cc02d7e2SAndroid Build Coastguard Worker //
9*cc02d7e2SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*cc02d7e2SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*cc02d7e2SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*cc02d7e2SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*cc02d7e2SAndroid Build Coastguard Worker // limitations under the License.
14*cc02d7e2SAndroid Build Coastguard Worker 
15*cc02d7e2SAndroid Build Coastguard Worker #ifndef GRPCPP_CREATE_CHANNEL_BINDER_H
16*cc02d7e2SAndroid Build Coastguard Worker #define GRPCPP_CREATE_CHANNEL_BINDER_H
17*cc02d7e2SAndroid Build Coastguard Worker 
18*cc02d7e2SAndroid Build Coastguard Worker #include <grpc/support/port_platform.h>
19*cc02d7e2SAndroid Build Coastguard Worker 
20*cc02d7e2SAndroid Build Coastguard Worker #ifdef GPR_ANDROID
21*cc02d7e2SAndroid Build Coastguard Worker 
22*cc02d7e2SAndroid Build Coastguard Worker #include <jni.h>
23*cc02d7e2SAndroid Build Coastguard Worker 
24*cc02d7e2SAndroid Build Coastguard Worker #include <memory>
25*cc02d7e2SAndroid Build Coastguard Worker 
26*cc02d7e2SAndroid Build Coastguard Worker #include "absl/strings/string_view.h"
27*cc02d7e2SAndroid Build Coastguard Worker 
28*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/channel.h>
29*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/security/binder_security_policy.h>
30*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/support/channel_arguments.h>
31*cc02d7e2SAndroid Build Coastguard Worker 
32*cc02d7e2SAndroid Build Coastguard Worker namespace grpc {
33*cc02d7e2SAndroid Build Coastguard Worker namespace experimental {
34*cc02d7e2SAndroid Build Coastguard Worker 
35*cc02d7e2SAndroid Build Coastguard Worker /// EXPERIMENTAL Create a new \a Channel based on binder transport. The package
36*cc02d7e2SAndroid Build Coastguard Worker /// name and class name will be used identify the specific application component
37*cc02d7e2SAndroid Build Coastguard Worker /// to connect to.
38*cc02d7e2SAndroid Build Coastguard Worker ///
39*cc02d7e2SAndroid Build Coastguard Worker /// \param jni_env_void Pointer to a JNIEnv structure
40*cc02d7e2SAndroid Build Coastguard Worker /// \param context The context that we will use to invoke \a bindService See
41*cc02d7e2SAndroid Build Coastguard Worker /// https://developer.android.com/reference/android/content/Context#bindService(android.content.Intent,%20android.content.ServiceConnection,%20int)
42*cc02d7e2SAndroid Build Coastguard Worker /// for detail.
43*cc02d7e2SAndroid Build Coastguard Worker /// \param package_name Package name of the component to be connected to
44*cc02d7e2SAndroid Build Coastguard Worker /// \param class_name Class name of the component to be connected to
45*cc02d7e2SAndroid Build Coastguard Worker /// \param security_policy Used for checking if remote component is allowed to
46*cc02d7e2SAndroid Build Coastguard Worker /// connect
47*cc02d7e2SAndroid Build Coastguard Worker std::shared_ptr<grpc::Channel> CreateBinderChannel(
48*cc02d7e2SAndroid Build Coastguard Worker     void* jni_env_void, jobject context, absl::string_view package_name,
49*cc02d7e2SAndroid Build Coastguard Worker     absl::string_view class_name,
50*cc02d7e2SAndroid Build Coastguard Worker     std::shared_ptr<grpc::experimental::binder::SecurityPolicy>
51*cc02d7e2SAndroid Build Coastguard Worker         security_policy);
52*cc02d7e2SAndroid Build Coastguard Worker 
53*cc02d7e2SAndroid Build Coastguard Worker /// EXPERIMENTAL Create a new \a Channel based on binder transport. The package
54*cc02d7e2SAndroid Build Coastguard Worker /// name and class name will be used identify the specific application component
55*cc02d7e2SAndroid Build Coastguard Worker /// to connect to.
56*cc02d7e2SAndroid Build Coastguard Worker ///
57*cc02d7e2SAndroid Build Coastguard Worker /// \param jni_env_void Pointer to a JNIEnv structure
58*cc02d7e2SAndroid Build Coastguard Worker /// \param context The context that we will use to invoke \a bindService See
59*cc02d7e2SAndroid Build Coastguard Worker /// https://developer.android.com/reference/android/content/Context#bindService(android.content.Intent,%20android.content.ServiceConnection,%20int)
60*cc02d7e2SAndroid Build Coastguard Worker /// for detail.
61*cc02d7e2SAndroid Build Coastguard Worker /// \param package_name Package name of the component to be connected to
62*cc02d7e2SAndroid Build Coastguard Worker /// \param class_name Class name of the component to be connected to
63*cc02d7e2SAndroid Build Coastguard Worker /// \param security_policy Used for checking if remote component is allowed to
64*cc02d7e2SAndroid Build Coastguard Worker /// connect
65*cc02d7e2SAndroid Build Coastguard Worker /// \param args Options for channel creation.
66*cc02d7e2SAndroid Build Coastguard Worker std::shared_ptr<grpc::Channel> CreateCustomBinderChannel(
67*cc02d7e2SAndroid Build Coastguard Worker     void* jni_env_void, jobject context, absl::string_view package_name,
68*cc02d7e2SAndroid Build Coastguard Worker     absl::string_view class_name,
69*cc02d7e2SAndroid Build Coastguard Worker     std::shared_ptr<grpc::experimental::binder::SecurityPolicy> security_policy,
70*cc02d7e2SAndroid Build Coastguard Worker     const ChannelArguments& args);
71*cc02d7e2SAndroid Build Coastguard Worker 
72*cc02d7e2SAndroid Build Coastguard Worker /// EXPERIMENTAL Create a new \a Channel based on binder transport.
73*cc02d7e2SAndroid Build Coastguard Worker ///
74*cc02d7e2SAndroid Build Coastguard Worker /// \param jni_env_void Pointer to a JNIEnv structure
75*cc02d7e2SAndroid Build Coastguard Worker /// \param context The context that we will use to invoke \a bindService See
76*cc02d7e2SAndroid Build Coastguard Worker /// https://developer.android.com/reference/android/content/Context#bindService(android.content.Intent,%20android.content.ServiceConnection,%20int)
77*cc02d7e2SAndroid Build Coastguard Worker /// for detail.
78*cc02d7e2SAndroid Build Coastguard Worker /// \param uri An URI that can be parsed as an `Intent` with
79*cc02d7e2SAndroid Build Coastguard Worker /// https://developer.android.com/reference/android/content/Intent#parseUri(java.lang.String,%20int)
80*cc02d7e2SAndroid Build Coastguard Worker /// \param security_policy Used for checking if remote component is allowed to
81*cc02d7e2SAndroid Build Coastguard Worker /// connect
82*cc02d7e2SAndroid Build Coastguard Worker std::shared_ptr<grpc::Channel> CreateBinderChannel(
83*cc02d7e2SAndroid Build Coastguard Worker     void* jni_env_void, jobject context, absl::string_view uri,
84*cc02d7e2SAndroid Build Coastguard Worker     std::shared_ptr<grpc::experimental::binder::SecurityPolicy>
85*cc02d7e2SAndroid Build Coastguard Worker         security_policy);
86*cc02d7e2SAndroid Build Coastguard Worker 
87*cc02d7e2SAndroid Build Coastguard Worker /// EXPERIMENTAL Create a new \a Channel based on binder transport.
88*cc02d7e2SAndroid Build Coastguard Worker ///
89*cc02d7e2SAndroid Build Coastguard Worker /// \param jni_env_void Pointer to a JNIEnv structure
90*cc02d7e2SAndroid Build Coastguard Worker /// \param context The context that we will use to invoke \a bindService See
91*cc02d7e2SAndroid Build Coastguard Worker /// https://developer.android.com/reference/android/content/Context#bindService(android.content.Intent,%20android.content.ServiceConnection,%20int)
92*cc02d7e2SAndroid Build Coastguard Worker /// for detail.
93*cc02d7e2SAndroid Build Coastguard Worker /// \param uri An URI that can be parsed as an `Intent` with
94*cc02d7e2SAndroid Build Coastguard Worker /// https://developer.android.com/reference/android/content/Intent#parseUri(java.lang.String,%20int)
95*cc02d7e2SAndroid Build Coastguard Worker /// \param security_policy Used for checking if remote component is allowed to
96*cc02d7e2SAndroid Build Coastguard Worker /// connect
97*cc02d7e2SAndroid Build Coastguard Worker /// \param args Options for channel creation.
98*cc02d7e2SAndroid Build Coastguard Worker std::shared_ptr<grpc::Channel> CreateCustomBinderChannel(
99*cc02d7e2SAndroid Build Coastguard Worker     void* jni_env_void, jobject context, absl::string_view uri,
100*cc02d7e2SAndroid Build Coastguard Worker     std::shared_ptr<grpc::experimental::binder::SecurityPolicy> security_policy,
101*cc02d7e2SAndroid Build Coastguard Worker     const ChannelArguments& args);
102*cc02d7e2SAndroid Build Coastguard Worker 
103*cc02d7e2SAndroid Build Coastguard Worker /// EXPERIMENTAL Finds internal binder transport Java code. To create channels
104*cc02d7e2SAndroid Build Coastguard Worker /// in threads created in native code, it is required to call this function
105*cc02d7e2SAndroid Build Coastguard Worker /// once beforehand in a thread that is not created in native code.
106*cc02d7e2SAndroid Build Coastguard Worker /// See
107*cc02d7e2SAndroid Build Coastguard Worker /// https://developer.android.com/training/articles/perf-jni#faq:-why-didnt-findclass-find-my-class
108*cc02d7e2SAndroid Build Coastguard Worker /// for details of this limitation.
109*cc02d7e2SAndroid Build Coastguard Worker /// Returns true when the initialization is successful.
110*cc02d7e2SAndroid Build Coastguard Worker bool InitializeBinderChannelJavaClass(void* jni_env_void);
111*cc02d7e2SAndroid Build Coastguard Worker 
112*cc02d7e2SAndroid Build Coastguard Worker /// EXPERIMENTAL Alternative version of `InitializeBinderChannelJavaClass(void*
113*cc02d7e2SAndroid Build Coastguard Worker /// jni_env_void)`. This version used a user-specified function to find the
114*cc02d7e2SAndroid Build Coastguard Worker /// required internal Java class. When a class is found, the `class_finder`
115*cc02d7e2SAndroid Build Coastguard Worker /// function should return a local reference to the class (jclass type). The
116*cc02d7e2SAndroid Build Coastguard Worker /// returned jclass will then be used to create global reference for gRPC to use
117*cc02d7e2SAndroid Build Coastguard Worker /// it later. After that, gRPC will DeleteLocalRef the returned local reference.
118*cc02d7e2SAndroid Build Coastguard Worker bool InitializeBinderChannelJavaClass(
119*cc02d7e2SAndroid Build Coastguard Worker     void* jni_env_void, std::function<void*(std::string)> class_finder);
120*cc02d7e2SAndroid Build Coastguard Worker 
121*cc02d7e2SAndroid Build Coastguard Worker }  // namespace experimental
122*cc02d7e2SAndroid Build Coastguard Worker }  // namespace grpc
123*cc02d7e2SAndroid Build Coastguard Worker 
124*cc02d7e2SAndroid Build Coastguard Worker #endif
125*cc02d7e2SAndroid Build Coastguard Worker 
126*cc02d7e2SAndroid Build Coastguard Worker #endif  // GRPCPP_CREATE_CHANNEL_BINDER_H
127