diff options
author | Calin Juravle <calin@google.com> | 2014-08-11 16:11:59 +0100 |
---|---|---|
committer | Calin Juravle <calin@google.com> | 2014-08-12 22:39:25 +0100 |
commit | 961ae12dea419ff0965f00e50dd16ef07181fba5 (patch) | |
tree | 180e9b455ad83042cc25d21e799e92a9fbb0a898 /libnativebridge | |
parent | a8d0c4a2b8f99dd3dba9d726bdecde98d350da50 (diff) | |
download | system_core-961ae12dea419ff0965f00e50dd16ef07181fba5.zip system_core-961ae12dea419ff0965f00e50dd16ef07181fba5.tar.gz system_core-961ae12dea419ff0965f00e50dd16ef07181fba5.tar.bz2 |
Move native bridge library in system/core
Bug: 16884833
Change-Id: I73aab8e212860ba5aee9444d801806d3da326a41
Diffstat (limited to 'libnativebridge')
-rw-r--r-- | libnativebridge/Android.mk | 34 | ||||
-rw-r--r-- | libnativebridge/native_bridge.cc | 106 |
2 files changed, 140 insertions, 0 deletions
diff --git a/libnativebridge/Android.mk b/libnativebridge/Android.mk new file mode 100644 index 0000000..8209bc7 --- /dev/null +++ b/libnativebridge/Android.mk @@ -0,0 +1,34 @@ +LOCAL_PATH:= $(call my-dir) + +NATIVE_BRIDGE_COMMON_SRC_FILES := \ + native_bridge.cc + +# Shared library for target +# ======================================================== +include $(CLEAR_VARS) + +LOCAL_MODULE:= libnativebridge + +LOCAL_SRC_FILES:= $(NATIVE_BRIDGE_COMMON_SRC_FILES) +LOCAL_CPP_EXTENSION := .cc +LOCAL_CFLAGS := -Werror +LOCAL_CPPFLAGS := -std=gnu++11 +LOCAL_LDFLAGS := -ldl +LOCAL_MULTILIB := both + +include $(BUILD_SHARED_LIBRARY) + +# Shared library for host +# ======================================================== +include $(CLEAR_VARS) + +LOCAL_MODULE:= libnativebridge + +LOCAL_SRC_FILES:= $(NATIVE_BRIDGE_COMMON_SRC_FILES) +LOCAL_CPP_EXTENSION := .cc +LOCAL_CFLAGS := -Werror +LOCAL_CPPFLAGS := -std=gnu++11 +LOCAL_LDFLAGS := -ldl +LOCAL_MULTILIB := both + +include $(BUILD_HOST_SHARED_LIBRARY) diff --git a/libnativebridge/native_bridge.cc b/libnativebridge/native_bridge.cc new file mode 100644 index 0000000..ad4ee73 --- /dev/null +++ b/libnativebridge/native_bridge.cc @@ -0,0 +1,106 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * 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. + */ + +#include "nativebridge/native_bridge.h" + +#include <dlfcn.h> +#include <stdio.h> +#include "utils/Mutex.h" + + +namespace android { + +static Mutex native_bridge_lock("native bridge lock"); + +// The symbol name exposed by native-bridge with the type of NativeBridgeCallbacks. +static constexpr const char* kNativeBridgeInterfaceSymbol = "NativeBridgeItf"; + +// The path of the library we are supposed to load. +static const char* native_bridge_library_path = nullptr; + +// Whether a native bridge is available (loaded and ready). +static bool available = false; +// Whether we have already initialized (or tried to). +static bool initialized = false; + +static NativeBridgeCallbacks* callbacks = nullptr; +static const NativeBridgeRuntimeCallbacks* runtime_callbacks = nullptr; + +void SetupNativeBridge(const char* nb_library_path, + const NativeBridgeRuntimeCallbacks* runtime_cbs) { + Mutex::Autolock auto_lock(native_bridge_lock); + + native_bridge_library_path = nb_library_path; + runtime_callbacks = runtime_cbs; + + if (native_bridge_library_path == nullptr) { + initialized = true; + available = false; + } +} + +static bool NativeBridgeInitialize() { + Mutex::Autolock auto_lock(native_bridge_lock); + + if (initialized) { + // Somebody did it before. + return available; + } + + available = false; + + void* handle = dlopen(native_bridge_library_path, RTLD_LAZY); + if (handle != nullptr) { + callbacks = reinterpret_cast<NativeBridgeCallbacks*>(dlsym(handle, + kNativeBridgeInterfaceSymbol)); + + if (callbacks != nullptr) { + available = callbacks->initialize(runtime_callbacks); + } + + if (!available) { + dlclose(handle); + } + } + + initialized = true; + + return available; +} + +void* NativeBridgeLoadLibrary(const char* libpath, int flag) { + if (NativeBridgeInitialize()) { + return callbacks->loadLibrary(libpath, flag); + } + return nullptr; +} + +void* NativeBridgeGetTrampoline(void* handle, const char* name, const char* shorty, + uint32_t len) { + if (NativeBridgeInitialize()) { + return callbacks->getTrampoline(handle, name, shorty, len); + } + return nullptr; +} + +bool NativeBridgeIsSupported(const char* libpath) { + if (NativeBridgeInitialize()) { + return callbacks->isSupported(libpath); + } + return false; +} + +}; // namespace android |