diff options
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.h | 107 |
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 |