Loading libs/android_runtime_lazy/android_runtime_lazy.cpp +22 −0 Original line number Diff line number Diff line Loading @@ -15,6 +15,7 @@ */ #define LOG_TAG "ANDROID_RUNTIME_LAZY" #include "android_runtime/AndroidRuntime.h" #include "android_os_Parcel.h" #include "android_util_Binder.h" #include <dlfcn.h> Loading @@ -28,12 +29,18 @@ namespace { std::once_flag loadFlag; typedef JNIEnv* (*getJNIEnv_t)(); // android_util_Binder.h typedef sp<IBinder> (*ibinderForJavaObject_t)(JNIEnv* env, jobject obj); typedef jobject (*javaObjectForIBinder_t)(JNIEnv* env, const sp<IBinder>& val); // android_os_Parcel.h typedef Parcel* (*parcelForJavaObject_t)(JNIEnv* env, jobject obj); getJNIEnv_t _getJNIEnv; ibinderForJavaObject_t _ibinderForJavaObject; javaObjectForIBinder_t _javaObjectForIBinder; parcelForJavaObject_t _parcelForJavaObject; void load() { std::call_once(loadFlag, []() { Loading Loading @@ -64,6 +71,13 @@ void load() { ALOGW("Could not find javaObjectForIBinder."); // no return } _parcelForJavaObject = reinterpret_cast<parcelForJavaObject_t>( dlsym(handle, "_ZN7android19parcelForJavaObjectEP7_JNIEnvP8_jobject")); if (_parcelForJavaObject == nullptr) { ALOGW("Could not find parcelForJavaObject."); // no return } }); } Loading Loading @@ -95,4 +109,12 @@ jobject javaObjectForIBinder(JNIEnv* env, const sp<IBinder>& val) { return _javaObjectForIBinder(env, val); } Parcel* parcelForJavaObject(JNIEnv* env, jobject obj) { load(); if (_parcelForJavaObject == nullptr) { return nullptr; } return _parcelForJavaObject(env, obj); } } // namespace android libs/android_runtime_lazy/include/android_os_Parcel.h 0 → 100644 +30 −0 Original line number Diff line number Diff line /* * Copyright (C) 2020 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/Parcel.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. Parcel* parcelForJavaObject(JNIEnv* env, jobject obj); } // namespace android libs/binder/ndk/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -50,6 +50,7 @@ cc_library_shared { "ibinder.cpp", "ibinder_jni.cpp", "parcel.cpp", "parcel_jni.cpp", "process.cpp", "stability.cpp", "status.cpp", Loading libs/binder/ndk/include_ndk/android/binder_ibinder_jni.h +5 −5 Original line number Diff line number Diff line Loading @@ -36,13 +36,13 @@ __BEGIN_DECLS /** * Converts an android.os.IBinder object into an AIBinder* object. * * If either env or the binder is null, null is returned. If this binder object was originally an * If the binder is null, null is returned. If this binder object was originally an * AIBinder object, the original object is returned. The returned object has one refcount * associated with it, and so this should be accompanied with an AIBinder_decStrong call. * * Available since API level 29. * * \param env Java environment. * \param env Java environment. Must not be null. * \param binder android.os.IBinder java object. * * \return an AIBinder object representing the Java binder object. If either parameter is null, or Loading @@ -54,12 +54,12 @@ __attribute__((warn_unused_result)) AIBinder* AIBinder_fromJavaBinder(JNIEnv* en /** * Converts an AIBinder* object into an android.os.IBinder object. * * If either env or the binder is null, null is returned. If this binder object was originally an * IBinder object, the original java object will be returned. * If the binder is null, null is returned. If this binder object was originally an IBinder object, * the original java object will be returned. * * Available since API level 29. * * \param env Java environment. * \param env Java environment. Must not be null. * \param binder the object to convert. * * \return an android.os.IBinder object or null if the parameters were null. Loading libs/binder/ndk/include_ndk/android/binder_parcel_jni.h 0 → 100644 +56 −0 Original line number Diff line number Diff line /* * Copyright (C) 2020 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. */ /** * @addtogroup NdkBinder * @{ */ /** * @file binder_parcel_jni.h * @brief Conversions between AParcel and android.os.Parcel */ #pragma once #include <android/binder_parcel.h> #include <jni.h> __BEGIN_DECLS #if __ANDROID_API__ >= 30 /** * Converts an android.os.Parcel object into an AParcel* object. * * If the parcel is null, null is returned. * * Available since API level 30. * * \param env Java environment. Must not be null. * \param parcel android.os.Parcel java object. * * \return an AParcel object representing the Java parcel object. If either parameter is null, this * will return null. This must be deleted with AParcel_delete. This does not take ownership of the * jobject and is only good for as long as the jobject is alive. */ __attribute__((warn_unused_result)) AParcel* AParcel_fromJavaParcel(JNIEnv* env, jobject parcel) __INTRODUCED_IN(30); #endif //__ANDROID_API__ >= 30 __END_DECLS /** @} */ Loading
libs/android_runtime_lazy/android_runtime_lazy.cpp +22 −0 Original line number Diff line number Diff line Loading @@ -15,6 +15,7 @@ */ #define LOG_TAG "ANDROID_RUNTIME_LAZY" #include "android_runtime/AndroidRuntime.h" #include "android_os_Parcel.h" #include "android_util_Binder.h" #include <dlfcn.h> Loading @@ -28,12 +29,18 @@ namespace { std::once_flag loadFlag; typedef JNIEnv* (*getJNIEnv_t)(); // android_util_Binder.h typedef sp<IBinder> (*ibinderForJavaObject_t)(JNIEnv* env, jobject obj); typedef jobject (*javaObjectForIBinder_t)(JNIEnv* env, const sp<IBinder>& val); // android_os_Parcel.h typedef Parcel* (*parcelForJavaObject_t)(JNIEnv* env, jobject obj); getJNIEnv_t _getJNIEnv; ibinderForJavaObject_t _ibinderForJavaObject; javaObjectForIBinder_t _javaObjectForIBinder; parcelForJavaObject_t _parcelForJavaObject; void load() { std::call_once(loadFlag, []() { Loading Loading @@ -64,6 +71,13 @@ void load() { ALOGW("Could not find javaObjectForIBinder."); // no return } _parcelForJavaObject = reinterpret_cast<parcelForJavaObject_t>( dlsym(handle, "_ZN7android19parcelForJavaObjectEP7_JNIEnvP8_jobject")); if (_parcelForJavaObject == nullptr) { ALOGW("Could not find parcelForJavaObject."); // no return } }); } Loading Loading @@ -95,4 +109,12 @@ jobject javaObjectForIBinder(JNIEnv* env, const sp<IBinder>& val) { return _javaObjectForIBinder(env, val); } Parcel* parcelForJavaObject(JNIEnv* env, jobject obj) { load(); if (_parcelForJavaObject == nullptr) { return nullptr; } return _parcelForJavaObject(env, obj); } } // namespace android
libs/android_runtime_lazy/include/android_os_Parcel.h 0 → 100644 +30 −0 Original line number Diff line number Diff line /* * Copyright (C) 2020 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/Parcel.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. Parcel* parcelForJavaObject(JNIEnv* env, jobject obj); } // namespace android
libs/binder/ndk/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -50,6 +50,7 @@ cc_library_shared { "ibinder.cpp", "ibinder_jni.cpp", "parcel.cpp", "parcel_jni.cpp", "process.cpp", "stability.cpp", "status.cpp", Loading
libs/binder/ndk/include_ndk/android/binder_ibinder_jni.h +5 −5 Original line number Diff line number Diff line Loading @@ -36,13 +36,13 @@ __BEGIN_DECLS /** * Converts an android.os.IBinder object into an AIBinder* object. * * If either env or the binder is null, null is returned. If this binder object was originally an * If the binder is null, null is returned. If this binder object was originally an * AIBinder object, the original object is returned. The returned object has one refcount * associated with it, and so this should be accompanied with an AIBinder_decStrong call. * * Available since API level 29. * * \param env Java environment. * \param env Java environment. Must not be null. * \param binder android.os.IBinder java object. * * \return an AIBinder object representing the Java binder object. If either parameter is null, or Loading @@ -54,12 +54,12 @@ __attribute__((warn_unused_result)) AIBinder* AIBinder_fromJavaBinder(JNIEnv* en /** * Converts an AIBinder* object into an android.os.IBinder object. * * If either env or the binder is null, null is returned. If this binder object was originally an * IBinder object, the original java object will be returned. * If the binder is null, null is returned. If this binder object was originally an IBinder object, * the original java object will be returned. * * Available since API level 29. * * \param env Java environment. * \param env Java environment. Must not be null. * \param binder the object to convert. * * \return an android.os.IBinder object or null if the parameters were null. Loading
libs/binder/ndk/include_ndk/android/binder_parcel_jni.h 0 → 100644 +56 −0 Original line number Diff line number Diff line /* * Copyright (C) 2020 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. */ /** * @addtogroup NdkBinder * @{ */ /** * @file binder_parcel_jni.h * @brief Conversions between AParcel and android.os.Parcel */ #pragma once #include <android/binder_parcel.h> #include <jni.h> __BEGIN_DECLS #if __ANDROID_API__ >= 30 /** * Converts an android.os.Parcel object into an AParcel* object. * * If the parcel is null, null is returned. * * Available since API level 30. * * \param env Java environment. Must not be null. * \param parcel android.os.Parcel java object. * * \return an AParcel object representing the Java parcel object. If either parameter is null, this * will return null. This must be deleted with AParcel_delete. This does not take ownership of the * jobject and is only good for as long as the jobject is alive. */ __attribute__((warn_unused_result)) AParcel* AParcel_fromJavaParcel(JNIEnv* env, jobject parcel) __INTRODUCED_IN(30); #endif //__ANDROID_API__ >= 30 __END_DECLS /** @} */