Loading libs/android_runtime_lazy/Android.bp 0 → 100644 +65 −0 Original line number Original line Diff line number Diff line /* * Copyright (C) 2019 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. */ // libandroid_runtime_lazy is a shim library. // This provides very limited small set of APIs from libandroid_runtime. // // By depending on this instead of libandroid_runtime, // a library can be loaded without paying the cost of libandroid_runtime // which is quite huge. The cost will be paid when libandroid_runtime is actually used. // // For Partial-source PDK build, there is a constraint that // frameworks/native modules should not depend on frameworks/base. // This library can be used to cut down the dependency between them. // (e.g. libbinder_ndk) // // Some libraries which serve as LL-NDK and NDK as well may depend on this // instead of libandroid_runtime. When they are used by a vendor process, // depending on libandroid_runtime is meaningless. In this case, // they can depend on libandroid_runtime_lazy. cc_library { name: "libandroid_runtime_lazy", vendor_available: true, cflags: [ "-Wall", "-Werror", "-Wunused", "-Wunreachable-code", ], srcs: [ "android_runtime_lazy.cpp", ], shared_libs: [ "liblog", "libutils", ], required: [ "libandroid_runtime", ], export_include_dirs: [ "include", ], header_libs: [ "jni_headers", "libbinder_headers", ], } libs/android_runtime_lazy/android_runtime_lazy.cpp 0 → 100644 +98 −0 Original line number Original line Diff line number Diff line /* * Copyright (C) 2019 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. */ #define LOG_TAG "ANDROID_RUNTIME_LAZY" #include "android_runtime/AndroidRuntime.h" #include "android_util_Binder.h" #include <dlfcn.h> #include <mutex> #include <log/log.h> namespace android { namespace { std::once_flag loadFlag; typedef JNIEnv* (*getJNIEnv_t)(); typedef sp<IBinder> (*ibinderForJavaObject_t)(JNIEnv* env, jobject obj); typedef jobject (*javaObjectForIBinder_t)(JNIEnv* env, const sp<IBinder>& val); getJNIEnv_t _getJNIEnv; ibinderForJavaObject_t _ibinderForJavaObject; javaObjectForIBinder_t _javaObjectForIBinder; void load() { std::call_once(loadFlag, []() { void* handle = dlopen("libandroid_runtime.so", RTLD_LAZY); if (handle == nullptr) { ALOGE("Could not open libandroid_runtime."); return; } _getJNIEnv = reinterpret_cast<getJNIEnv_t>( dlsym(handle, "_ZN7android14AndroidRuntime9getJNIEnvEv")); if (_getJNIEnv == nullptr) { ALOGW("Could not find getJNIEnv."); // no return } _ibinderForJavaObject = reinterpret_cast<ibinderForJavaObject_t>( dlsym(handle, "_ZN7android20ibinderForJavaObjectEP7_JNIEnvP8_jobject")); if (_ibinderForJavaObject == nullptr) { ALOGW("Could not find ibinderForJavaObject."); // no return } _javaObjectForIBinder = reinterpret_cast<javaObjectForIBinder_t>( dlsym(handle, "_ZN7android20javaObjectForIBinderEP7_JNIEnvRKNS_2spINS_7IBinderEEE")); if (_javaObjectForIBinder == nullptr) { ALOGW("Could not find javaObjectForIBinder."); // no return } }); } } // namespace // exports delegate functions JNIEnv* AndroidRuntime::getJNIEnv() { load(); if (_getJNIEnv == nullptr) { return nullptr; } return _getJNIEnv(); } sp<IBinder> ibinderForJavaObject(JNIEnv* env, jobject obj) { load(); if (_ibinderForJavaObject == nullptr) { return nullptr; } return _ibinderForJavaObject(env, obj); } jobject javaObjectForIBinder(JNIEnv* env, const sp<IBinder>& val) { load(); if (_javaObjectForIBinder == nullptr) { return nullptr; } return _javaObjectForIBinder(env, val); } } // namespace android libs/android_runtime_lazy/include/android_runtime/AndroidRuntime.h 0 → 100644 +30 −0 Original line number Original line Diff line number Diff line /* * Copyright (C) 2019 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. */ #pragma once #include "jni.h" namespace android { // Intentionally use the same name with AndroidRuntime in frameworks/base/core/jni/ // to make the client use this in the same way with the original class. class AndroidRuntime { public: static JNIEnv* getJNIEnv(); }; } // namespace android libs/android_runtime_lazy/include/android_util_Binder.h 0 → 100644 +31 −0 Original line number Original line Diff line number Diff line /* * Copyright (C) 2019 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. */ #pragma once #include <binder/IBinder.h> #include "jni.h" namespace android { // The name of this file is same with the file in frameworks/base/core/jni/ // This is intentional to make the client use these exported functions // in the same way with the original. jobject javaObjectForIBinder(JNIEnv* env, const sp<IBinder>& val); sp<IBinder> ibinderForJavaObject(JNIEnv* env, jobject obj); } // namespace android libs/binder/ndk/Android.bp +1 −6 Original line number Original line Diff line number Diff line Loading @@ -39,17 +39,12 @@ cc_library { ], ], shared_libs: [ shared_libs: [ "libandroid_runtime_lazy", "libbase", "libbase", "libbinder", "libbinder", "libutils", "libutils", ], ], required: [ // libbinder_ndk may be used by Java and non-Java things. When lower-level things use it, // they shouldn't have to take on the cost of loading libandroid_runtime. "libandroid_runtime", ], header_libs: [ header_libs: [ "jni_headers", "jni_headers", ], ], Loading Loading
libs/android_runtime_lazy/Android.bp 0 → 100644 +65 −0 Original line number Original line Diff line number Diff line /* * Copyright (C) 2019 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. */ // libandroid_runtime_lazy is a shim library. // This provides very limited small set of APIs from libandroid_runtime. // // By depending on this instead of libandroid_runtime, // a library can be loaded without paying the cost of libandroid_runtime // which is quite huge. The cost will be paid when libandroid_runtime is actually used. // // For Partial-source PDK build, there is a constraint that // frameworks/native modules should not depend on frameworks/base. // This library can be used to cut down the dependency between them. // (e.g. libbinder_ndk) // // Some libraries which serve as LL-NDK and NDK as well may depend on this // instead of libandroid_runtime. When they are used by a vendor process, // depending on libandroid_runtime is meaningless. In this case, // they can depend on libandroid_runtime_lazy. cc_library { name: "libandroid_runtime_lazy", vendor_available: true, cflags: [ "-Wall", "-Werror", "-Wunused", "-Wunreachable-code", ], srcs: [ "android_runtime_lazy.cpp", ], shared_libs: [ "liblog", "libutils", ], required: [ "libandroid_runtime", ], export_include_dirs: [ "include", ], header_libs: [ "jni_headers", "libbinder_headers", ], }
libs/android_runtime_lazy/android_runtime_lazy.cpp 0 → 100644 +98 −0 Original line number Original line Diff line number Diff line /* * Copyright (C) 2019 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. */ #define LOG_TAG "ANDROID_RUNTIME_LAZY" #include "android_runtime/AndroidRuntime.h" #include "android_util_Binder.h" #include <dlfcn.h> #include <mutex> #include <log/log.h> namespace android { namespace { std::once_flag loadFlag; typedef JNIEnv* (*getJNIEnv_t)(); typedef sp<IBinder> (*ibinderForJavaObject_t)(JNIEnv* env, jobject obj); typedef jobject (*javaObjectForIBinder_t)(JNIEnv* env, const sp<IBinder>& val); getJNIEnv_t _getJNIEnv; ibinderForJavaObject_t _ibinderForJavaObject; javaObjectForIBinder_t _javaObjectForIBinder; void load() { std::call_once(loadFlag, []() { void* handle = dlopen("libandroid_runtime.so", RTLD_LAZY); if (handle == nullptr) { ALOGE("Could not open libandroid_runtime."); return; } _getJNIEnv = reinterpret_cast<getJNIEnv_t>( dlsym(handle, "_ZN7android14AndroidRuntime9getJNIEnvEv")); if (_getJNIEnv == nullptr) { ALOGW("Could not find getJNIEnv."); // no return } _ibinderForJavaObject = reinterpret_cast<ibinderForJavaObject_t>( dlsym(handle, "_ZN7android20ibinderForJavaObjectEP7_JNIEnvP8_jobject")); if (_ibinderForJavaObject == nullptr) { ALOGW("Could not find ibinderForJavaObject."); // no return } _javaObjectForIBinder = reinterpret_cast<javaObjectForIBinder_t>( dlsym(handle, "_ZN7android20javaObjectForIBinderEP7_JNIEnvRKNS_2spINS_7IBinderEEE")); if (_javaObjectForIBinder == nullptr) { ALOGW("Could not find javaObjectForIBinder."); // no return } }); } } // namespace // exports delegate functions JNIEnv* AndroidRuntime::getJNIEnv() { load(); if (_getJNIEnv == nullptr) { return nullptr; } return _getJNIEnv(); } sp<IBinder> ibinderForJavaObject(JNIEnv* env, jobject obj) { load(); if (_ibinderForJavaObject == nullptr) { return nullptr; } return _ibinderForJavaObject(env, obj); } jobject javaObjectForIBinder(JNIEnv* env, const sp<IBinder>& val) { load(); if (_javaObjectForIBinder == nullptr) { return nullptr; } return _javaObjectForIBinder(env, val); } } // namespace android
libs/android_runtime_lazy/include/android_runtime/AndroidRuntime.h 0 → 100644 +30 −0 Original line number Original line Diff line number Diff line /* * Copyright (C) 2019 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. */ #pragma once #include "jni.h" namespace android { // Intentionally use the same name with AndroidRuntime in frameworks/base/core/jni/ // to make the client use this in the same way with the original class. class AndroidRuntime { public: static JNIEnv* getJNIEnv(); }; } // namespace android
libs/android_runtime_lazy/include/android_util_Binder.h 0 → 100644 +31 −0 Original line number Original line Diff line number Diff line /* * Copyright (C) 2019 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. */ #pragma once #include <binder/IBinder.h> #include "jni.h" namespace android { // The name of this file is same with the file in frameworks/base/core/jni/ // This is intentional to make the client use these exported functions // in the same way with the original. jobject javaObjectForIBinder(JNIEnv* env, const sp<IBinder>& val); sp<IBinder> ibinderForJavaObject(JNIEnv* env, jobject obj); } // namespace android
libs/binder/ndk/Android.bp +1 −6 Original line number Original line Diff line number Diff line Loading @@ -39,17 +39,12 @@ cc_library { ], ], shared_libs: [ shared_libs: [ "libandroid_runtime_lazy", "libbase", "libbase", "libbinder", "libbinder", "libutils", "libutils", ], ], required: [ // libbinder_ndk may be used by Java and non-Java things. When lower-level things use it, // they shouldn't have to take on the cost of loading libandroid_runtime. "libandroid_runtime", ], header_libs: [ header_libs: [ "jni_headers", "jni_headers", ], ], Loading