summaryrefslogtreecommitdiff
path: root/grpc/src/core/ext/transport/binder/utils/ndk_binder.h
diff options
context:
space:
mode:
Diffstat (limited to 'grpc/src/core/ext/transport/binder/utils/ndk_binder.h')
-rw-r--r--grpc/src/core/ext/transport/binder/utils/ndk_binder.h107
1 files changed, 107 insertions, 0 deletions
diff --git a/grpc/src/core/ext/transport/binder/utils/ndk_binder.h b/grpc/src/core/ext/transport/binder/utils/ndk_binder.h
new file mode 100644
index 00000000..25ebb80c
--- /dev/null
+++ b/grpc/src/core/ext/transport/binder/utils/ndk_binder.h
@@ -0,0 +1,107 @@
+// Copyright 2021 gRPC authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef GRPC_CORE_EXT_TRANSPORT_BINDER_UTILS_NDK_BINDER_H
+#define GRPC_CORE_EXT_TRANSPORT_BINDER_UTILS_NDK_BINDER_H
+
+#include <grpc/support/port_platform.h>
+
+#ifdef GPR_SUPPORT_BINDER_TRANSPORT
+
+#include <assert.h>
+#include <jni.h>
+
+#include <memory>
+
+// This file defines NdkBinder functions, variables, and types in
+// grpc_binder::ndk_util namespace. This allows us to dynamically load
+// libbinder_ndk at runtime, and make it possible to compile the code without
+// the library present at compile time.
+
+// TODO(mingcl): Consider if we want to check API level and include NDK headers
+// normally if the level is high enough
+
+namespace grpc_binder {
+namespace ndk_util {
+
+struct AIBinder;
+struct AParcel;
+struct AIBinder_Class;
+
+// Only enum values used by the project is defined here
+enum {
+ FLAG_ONEWAY = 0x01,
+};
+enum {
+ STATUS_OK = 0,
+ STATUS_UNKNOWN_ERROR = (-2147483647 - 1),
+};
+
+typedef int32_t binder_status_t;
+typedef uint32_t binder_flags_t;
+typedef uint32_t transaction_code_t;
+
+typedef bool (*AParcel_byteArrayAllocator)(void* arrayData, int32_t length,
+ int8_t** outBuffer);
+typedef bool (*AParcel_stringAllocator)(void* stringData, int32_t length,
+ char** buffer);
+typedef void* (*AIBinder_Class_onCreate)(void* args);
+typedef void (*AIBinder_Class_onDestroy)(void* userData);
+typedef binder_status_t (*AIBinder_Class_onTransact)(AIBinder* binder,
+ transaction_code_t code,
+ const AParcel* in,
+ AParcel* out);
+
+void AIBinder_Class_disableInterfaceTokenHeader(AIBinder_Class* clazz);
+void* AIBinder_getUserData(AIBinder* binder);
+uid_t AIBinder_getCallingUid();
+AIBinder* AIBinder_fromJavaBinder(JNIEnv* env, jobject binder);
+AIBinder_Class* AIBinder_Class_define(const char* interfaceDescriptor,
+ AIBinder_Class_onCreate onCreate,
+ AIBinder_Class_onDestroy onDestroy,
+ AIBinder_Class_onTransact onTransact);
+AIBinder* AIBinder_new(const AIBinder_Class* clazz, void* args);
+bool AIBinder_associateClass(AIBinder* binder, const AIBinder_Class* clazz);
+void AIBinder_incStrong(AIBinder* binder);
+void AIBinder_decStrong(AIBinder* binder);
+binder_status_t AIBinder_transact(AIBinder* binder, transaction_code_t code,
+ AParcel** in, AParcel** out,
+ binder_flags_t flags);
+binder_status_t AParcel_readByteArray(const AParcel* parcel, void* arrayData,
+ AParcel_byteArrayAllocator allocator);
+void AParcel_delete(AParcel* parcel);
+int32_t AParcel_getDataSize(const AParcel* parcel);
+binder_status_t AParcel_writeInt32(AParcel* parcel, int32_t value);
+binder_status_t AParcel_writeInt64(AParcel* parcel, int64_t value);
+binder_status_t AParcel_writeStrongBinder(AParcel* parcel, AIBinder* binder);
+binder_status_t AParcel_writeString(AParcel* parcel, const char* string,
+ int32_t length);
+binder_status_t AParcel_readInt32(const AParcel* parcel, int32_t* value);
+binder_status_t AParcel_readInt64(const AParcel* parcel, int64_t* value);
+binder_status_t AParcel_readString(const AParcel* parcel, void* stringData,
+ AParcel_stringAllocator allocator);
+binder_status_t AParcel_readStrongBinder(const AParcel* parcel,
+ AIBinder** binder);
+binder_status_t AParcel_writeByteArray(AParcel* parcel, const int8_t* arrayData,
+ int32_t length);
+binder_status_t AIBinder_prepareTransaction(AIBinder* binder, AParcel** in);
+jobject AIBinder_toJavaBinder(JNIEnv* env, AIBinder* binder);
+
+} // namespace ndk_util
+
+} // namespace grpc_binder
+
+#endif /*GPR_SUPPORT_BINDER_TRANSPORT*/
+
+#endif // GRPC_CORE_EXT_TRANSPORT_BINDER_UTILS_NDK_BINDER_H