diff --git a/devtools/devtools-integration/android/src/main/cpp/include/devtools/devtools_jni.h b/devtools/devtools-integration/android/src/main/cpp/include/devtools/devtools_jni.h index 3dd33284210..faac571fa73 100644 --- a/devtools/devtools-integration/android/src/main/cpp/include/devtools/devtools_jni.h +++ b/devtools/devtools-integration/android/src/main/cpp/include/devtools/devtools_jni.h @@ -27,9 +27,9 @@ namespace hippy::devtools { class DevtoolsJni { public: - static void Init(JavaVM* j_vm, void* reserved, JNIEnv* j_env); + static void Init(JavaVM* j_vm, void* reserved); - static void Destroy(JavaVM* j_vm, void* reserved, JNIEnv* j_env); + static void Destroy(JavaVM* j_vm, void* reserved); }; jint OnCreateDevtools(JNIEnv* j_env, diff --git a/devtools/devtools-integration/android/src/main/cpp/src/devtools_jni.cc b/devtools/devtools-integration/android/src/main/cpp/src/devtools_jni.cc index 6288102ff9a..623e5098e1a 100644 --- a/devtools/devtools-integration/android/src/main/cpp/src/devtools_jni.cc +++ b/devtools/devtools-integration/android/src/main/cpp/src/devtools_jni.cc @@ -62,10 +62,10 @@ REGISTER_JNI("com/tencent/devtools/vfs/DevtoolsProcessor", // NOLINT(cert-err58 // needs to call by JNI_OnLoad -void DevtoolsJni::Init(JavaVM* j_vm, void* reserved, JNIEnv* j_env) {} +void DevtoolsJni::Init(JavaVM* j_vm, void* reserved) {} // needs to call by JNI_OnUnload -void DevtoolsJni::Destroy(JavaVM* j_vm, void* reserved, JNIEnv* j_env) {} +void DevtoolsJni::Destroy(JavaVM* j_vm, void* reserved) {} constexpr uint32_t kPoolSize = 1; std::make_shared worker_manager; diff --git a/framework/android/connector/driver/js/src/main/cpp/src/js_driver_jni.cc b/framework/android/connector/driver/js/src/main/cpp/src/js_driver_jni.cc index ac38660a3c8..ea6bba59a94 100644 --- a/framework/android/connector/driver/js/src/main/cpp/src/js_driver_jni.cc +++ b/framework/android/connector/driver/js/src/main/cpp/src/js_driver_jni.cc @@ -40,7 +40,7 @@ #include "footstone/worker_manager.h" #include "jni/data_holder.h" #include "jni/jni_env.h" -#include "jni/jni_load.h" +#include "jni/jni_invocation.h" #include "jni/jni_register.h" #include "jni/jni_utils.h" #include "jni/scoped_java_ref.h" @@ -362,24 +362,26 @@ void SetDomManager(JNIEnv* j_env, runtime->GetScope()->SetDomManager(dom_manager_object); } -bool JsDriverOnLoad(JavaVM* j_vm, void* reserved, JNIEnv* j_env) { +static jint JNI_OnLoad(__unused JavaVM* j_vm, __unused void* reserved) { + auto j_env = JNIEnvironment::GetInstance()->AttachCurrentThread(); hippy::ExceptionHandler::Init(j_env); hippy::ConvertUtils::Init(j_env); hippy::JavaTurboModule::Init(j_env); hippy::TurboModuleManager::Init(j_env); hippy::InitBridge(j_env); - return true; + return JNI_VERSION_1_4; } -void JsDriverOnUnLoad(JavaVM* j_vm, void* reserved, JNIEnv* j_env) { +static void JNI_OnUnload(__unused JavaVM* j_vm, __unused void* reserved) { + auto j_env = JNIEnvironment::GetInstance()->AttachCurrentThread(); hippy::napi::V8VM::PlatformDestroy(); hippy::ConvertUtils::Destroy(j_env); hippy::JavaTurboModule::Destroy(j_env); hippy::TurboModuleManager::Destroy(j_env); } -REGISTER_JNI_ONLOAD(JsDriverOnLoad) -REGISTER_JNI_ONUNLOAD(JsDriverOnUnLoad) +REGISTER_JNI_ONLOAD(JNI_OnLoad) +REGISTER_JNI_ONUNLOAD(JNI_OnUnload) } } diff --git a/framework/android/connector/support/.gitignore b/framework/android/connector/support/.gitignore deleted file mode 100644 index a676a5ef5db..00000000000 --- a/framework/android/connector/support/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -/build -local.properties -.idea/ -.gradle/ -build/ \ No newline at end of file diff --git a/framework/android/src/main/cpp/src/jni/entry.cc b/framework/android/src/main/cpp/src/jni/entry.cc index f74158a3ca4..fbd6b2c03e3 100644 --- a/framework/android/src/main/cpp/src/jni/entry.cc +++ b/framework/android/src/main/cpp/src/jni/entry.cc @@ -31,7 +31,6 @@ #include #include -#include "connector/js_driver_jni.h" #include "footstone/check.h" #include "footstone/deserializer.h" #include "footstone/hippy_value.h" @@ -40,7 +39,7 @@ #include "footstone/worker_manager.h" #include "jni/data_holder.h" #include "jni/jni_env.h" -#include "jni/jni_load.h" +#include "jni/jni_invocation.h" #include "jni/jni_register.h" #include "jni/jni_utils.h" #include "vfs/handler/asset_handler.h" @@ -145,42 +144,8 @@ void OnDestroyVfs(__unused JNIEnv* j_env, __unused jobject j_object, jint j_id) bool flag = hippy::global_data_holder.Erase(id); FOOTSTONE_DCHECK(flag); } + } // namespace bridge } // namespace framework } // namespace hippy -jint JNI_OnLoad(JavaVM* j_vm, __unused void* reserved) { - JNIEnv* j_env; - jint onLoad_err = -1; - if ((j_vm)->GetEnv(reinterpret_cast(&j_env), JNI_VERSION_1_4) != JNI_OK) { - return onLoad_err; - } - if (!j_env) { - return onLoad_err; - } - - bool ret = hippy::JNIRegister::RegisterMethods(j_env); - if (!ret) { - return onLoad_err; - } - - hippy::JNIEnvironment::GetInstance()->init(j_vm, j_env); - hippy::Uri::Init(); - hippy::JniDelegateHandler::Init(j_env); - hippy::ResourceHolder::Init(); - - hippy::JniLoad::Instance()->Onload(j_vm, reserved, j_env); - - return JNI_VERSION_1_4; -} - -void JNI_OnUnload(__unused JavaVM* j_vm, __unused void* reserved) { - auto j_env = hippy::JNIEnvironment::GetInstance()->AttachCurrentThread(); - - hippy::JniLoad::Instance()->Onunload(j_vm, reserved, j_env); - hippy::JniDelegateHandler::Destroy(); - hippy::ResourceHolder::Destroy(); - hippy::Uri::Destroy(); - - hippy::JNIEnvironment::DestroyInstance(); -} diff --git a/modules/android/jni/CMakeLists.txt b/modules/android/jni/CMakeLists.txt index 6f8da0b771e..a3264f017fc 100644 --- a/modules/android/jni/CMakeLists.txt +++ b/modules/android/jni/CMakeLists.txt @@ -45,7 +45,7 @@ target_link_libraries(${PROJECT_NAME} PRIVATE footstone) set(SOURCE_SET src/data_holder.cc src/jni_env.cc - src/jni_load.cc + src/jni_invocation.cc src/jni_register.cc src/jni_utils.cc src/scoped_java_ref.cc) diff --git a/modules/android/jni/include/jni/jni_env.h b/modules/android/jni/include/jni/jni_env.h index c7d5c0596af..67b8872cfd3 100644 --- a/modules/android/jni/include/jni/jni_env.h +++ b/modules/android/jni/include/jni/jni_env.h @@ -40,7 +40,7 @@ class JNIEnvironment { JNIEnvironment() = default; ~JNIEnvironment() = default; - void init(JavaVM* vm, JNIEnv* env); + jint JNI_OnLoad(JavaVM* vm, __unused void* reserved); JNIEnv* AttachCurrentThread(); private: diff --git a/modules/android/jni/include/jni/jni_load.h b/modules/android/jni/include/jni/jni_invocation.h similarity index 54% rename from modules/android/jni/include/jni/jni_load.h rename to modules/android/jni/include/jni/jni_invocation.h index 74c57695ce9..09e621b3a00 100644 --- a/modules/android/jni/include/jni/jni_load.h +++ b/modules/android/jni/include/jni/jni_invocation.h @@ -33,24 +33,24 @@ inline namespace framework { inline namespace jni { -class JniLoad { +class JniInvocation { public: - using JniOnloadFunc = std::function; - using JniOnunloadFunc = std::function; + using JniOnloadFunc = std::function; + using JniOnunloadFunc = std::function; - JniLoad() = default; + JniInvocation() = default; - inline void PushOnload(JniOnloadFunc f) { + inline void PushJniOnLoad(JniOnloadFunc f) { jni_onload_.emplace_back(f); } - inline void PushOnunload(JniOnunloadFunc f) { + inline void PushJniOnUnload(JniOnunloadFunc f) { jni_onunload_.emplace_back(f); } - bool Onload(JavaVM* j_vm, void* reserved, JNIEnv* j_env); - void Onunload(JavaVM* j_vm, void* reserved, JNIEnv* j_env); + jint JNI_OnLoad(JavaVM* j_vm, void* reserved); + void JNI_OnUnload(JavaVM* j_vm, void* reserved); - static std::shared_ptr Instance(); + static std::shared_ptr Instance(); private: std::vector jni_onload_; @@ -61,14 +61,17 @@ class JniLoad { } } -#define REGISTER_JNI_ONLOAD(FUNC_NAME) \ - auto __REGISTER_JNI_ONLOAD_##FUNC_NAME = []() { \ - JniLoad::Instance()->PushOnload(FUNC_NAME); \ - return 0; \ +jint JNI_OnLoad(JavaVM* j_vm, void* reserved); +void JNI_OnUnload(JavaVM* j_vm, void* reserved); + +#define REGISTER_JNI_ONLOAD(FUNC_NAME) \ + auto onload = []() { \ + JniInvocation::Instance()->PushJniOnLoad(FUNC_NAME); \ + return 0; \ }(); -#define REGISTER_JNI_ONUNLOAD(FUNC_NAME) \ - auto __REGISTER_JNI_ONUNLOAD_##FUNC_NAME = []() { \ - JniLoad::Instance()->PushOnunload(FUNC_NAME); \ - return 0; \ +#define REGISTER_JNI_ONUNLOAD(FUNC_NAME) \ + auto onunload = []() { \ + JniInvocation::Instance()->PushJniOnUnload(FUNC_NAME); \ + return 0; \ }(); diff --git a/modules/android/jni/include/jni/jni_register.h b/modules/android/jni/include/jni/jni_register.h index 098fc342daa..ed10d87a63e 100644 --- a/modules/android/jni/include/jni/jni_register.h +++ b/modules/android/jni/include/jni/jni_register.h @@ -51,7 +51,6 @@ class JNIRegisterData { class JNIRegister { public: static std::unique_ptr &GetInstance(); - static bool RegisterMethods(JNIEnv *j_env); JNIRegister() = default; JNIRegister(const JNIRegister &) = delete; @@ -100,3 +99,6 @@ class JNIRegister { #define REGISTER_STATIC_JNI(clazz, name, signature, pointer) \ REGISTER_JNI_TEMP(clazz, name, signature, pointer, true, __COUNTER__) + +//#undef REGISTER_JNI_TEMP +//#undef REGISTER_JNI_INTERNAL diff --git a/modules/android/jni/src/jni_env.cc b/modules/android/jni/src/jni_env.cc index d97df37bd79..21dcd7f6843 100644 --- a/modules/android/jni/src/jni_env.cc +++ b/modules/android/jni/src/jni_env.cc @@ -44,12 +44,15 @@ struct JNIEnvAutoRelease { } }; -void JNIEnvironment::init(JavaVM* j_vm, JNIEnv* j_env) { +jint JNIEnvironment::JNI_OnLoad(JavaVM* j_vm, __unused void* reserved) { j_vm_ = j_vm; + JNIEnv* j_env; + FOOTSTONE_CHECK((j_vm)->GetEnv(reinterpret_cast(&j_env), JNI_VERSION_1_4) == JNI_OK); if (j_env->ExceptionCheck()) { j_env->ExceptionClear(); } + return JNI_VERSION_1_4; } std::shared_ptr JNIEnvironment::GetInstance() { diff --git a/modules/android/jni/src/jni_invocation.cc b/modules/android/jni/src/jni_invocation.cc new file mode 100644 index 00000000000..a03746b88d9 --- /dev/null +++ b/modules/android/jni/src/jni_invocation.cc @@ -0,0 +1,77 @@ +/* + * + * Tencent is pleased to support the open source community by making + * Hippy available. + * + * Copyright (C) 2019 THL A29 Limited, a Tencent company. + * All rights reserved. + * + * 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 "jni/jni_invocation.h" + +#include +#include + +#include "footstone/logging.h" + +#include "jni/jni_env.h" +#include "jni/jni_register.h" + +namespace hippy { +inline namespace framework { +inline namespace jni { + +std::shared_ptr JniInvocation::Instance() { + static std::shared_ptr instance = nullptr; + static std::once_flag flag; + + std::call_once(flag, [] { instance = std::make_shared(); }); + + return instance; +} + +jint JniInvocation::JNI_OnLoad(JavaVM* j_vm, void* reserved) { + jint version = hippy::JNIEnvironment::GetInstance()->JNI_OnLoad(j_vm, reserved); + for (const auto& func: jni_onload_) { + auto ret = func(j_vm, reserved); + if (ret != version){ + FOOTSTONE_CHECK(false); + } + } + return version; +} + +void JniInvocation::JNI_OnUnload(JavaVM* j_vm, void* reserved) { + for (const auto& func: jni_onunload_) { + func(j_vm, reserved); + } + hippy::JNIEnvironment::DestroyInstance(); +} + +} +} +} + + +jint JNI_OnLoad(JavaVM* j_vm, __unused void* reserved) { + hippy::JniInvocation::Instance()->JNI_OnLoad(j_vm, reserved); + + return JNI_VERSION_1_4; +} + +void JNI_OnUnload(__unused JavaVM* j_vm, __unused void* reserved) { + hippy::JniInvocation::Instance()->JNI_OnUnload(j_vm, reserved); +} diff --git a/modules/android/jni/src/jni_load.cc b/modules/android/jni/src/jni_load.cc deleted file mode 100644 index ee710efc54a..00000000000 --- a/modules/android/jni/src/jni_load.cc +++ /dev/null @@ -1,58 +0,0 @@ -/* - * - * Tencent is pleased to support the open source community by making - * Hippy available. - * - * Copyright (C) 2019 THL A29 Limited, a Tencent company. - * All rights reserved. - * - * 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 "jni/jni_load.h" - -#include -#include - -#include "footstone/logging.h" - -namespace hippy { -inline namespace framework { -inline namespace jni { - -std::shared_ptr JniLoad::Instance() { - static std::shared_ptr instance = nullptr; - static std::once_flag flag; - - std::call_once(flag, [] { instance = std::make_shared(); }); - - return instance; -} - -bool JniLoad::Onload(JavaVM* j_vm, void* reserved, JNIEnv* j_env) { - return std::all_of(jni_onload_.begin(), jni_onload_.end(), - [j_vm, reserved, j_env](auto func) { - return func(j_vm, reserved, j_env); - }); -} - -void JniLoad::Onunload(JavaVM* j_vm, void* reserved, JNIEnv* j_env) { - for (const auto& func: jni_onunload_) { - func(j_vm, reserved, j_env); - } -} - -} -} -} diff --git a/modules/android/jni/src/jni_register.cc b/modules/android/jni/src/jni_register.cc index 438b737f211..3a0f4c385cb 100644 --- a/modules/android/jni/src/jni_register.cc +++ b/modules/android/jni/src/jni_register.cc @@ -25,6 +25,7 @@ #include "footstone/check.h" #include "footstone/logging.h" #include "include/jni/jni_env.h" +#include "include/jni/jni_invocation.h" namespace hippy { inline namespace framework { @@ -39,21 +40,27 @@ std::unique_ptr& JNIRegister::GetInstance() { return instance; } -bool JNIRegister::RegisterMethods(JNIEnv* j_env) { - const std::unordered_map>& - jni_modules = JNIRegister::GetInstance()->GetJniModules(); +JNIRegisterData::JNIRegisterData(const char* name, + const char* sign, + void* pointer, + bool is_static) + : name_(name), sign_(sign), pointer_(pointer), is_static_(is_static) {} + +JNINativeMethod JNIRegisterData::ToJNINativeMethod() { + return {name_.c_str(), sign_.c_str(), pointer_}; +} +jint JNI_OnLoad(__unused JavaVM* j_vm, __unused void* reserved) { + auto j_env = JNIEnvironment::GetInstance()->AttachCurrentThread(); + const auto& jni_modules = JNIRegister::GetInstance()->GetJniModules(); for (const auto & jni_module : jni_modules) { std::vector methods; jclass j_class; const char* class_name = jni_module.first.c_str(); j_class = j_env->FindClass(class_name); if (!j_class) { - FOOTSTONE_DLOG(ERROR) - << "NativeAccess class " - << class_name - << "not found"; - return false; + FOOTSTONE_CHECK(false) << "NativeAccess class " << class_name << "not found"; + return JNI_VERSION_1_4; } std::vector jni_register_data = jni_module.second; for (auto & data : jni_register_data) { @@ -69,7 +76,7 @@ bool JNIRegister::RegisterMethods(JNIEnv* j_env) { if (j_env->ExceptionCheck()) { j_env->ExceptionDescribe(); } - FOOTSTONE_DLOG(ERROR) + FOOTSTONE_CHECK(false) << "Cannot find method name = " << method.name << " signature = " @@ -83,18 +90,10 @@ bool JNIRegister::RegisterMethods(JNIEnv* j_env) { j_env->RegisterNatives(j_class, methods.data(), footstone::check::checked_numeric_cast(methods.size())); } - return true; + return JNI_VERSION_1_4; } -JNIRegisterData::JNIRegisterData(const char* name, - const char* sign, - void* pointer, - bool is_static) - : name_(name), sign_(sign), pointer_(pointer), is_static_(is_static) {} - -JNINativeMethod JNIRegisterData::ToJNINativeMethod() { - return {name_.c_str(), sign_.c_str(), pointer_}; -} +REGISTER_JNI_ONLOAD(hippy::JNI_OnLoad) } } diff --git a/modules/vfs/android/src/main/cpp/include/vfs/handler/jni_delegate_handler.h b/modules/vfs/android/src/main/cpp/include/vfs/handler/jni_delegate_handler.h index 0d0c23a3d07..dae197e3406 100644 --- a/modules/vfs/android/src/main/cpp/include/vfs/handler/jni_delegate_handler.h +++ b/modules/vfs/android/src/main/cpp/include/vfs/handler/jni_delegate_handler.h @@ -54,8 +54,6 @@ class JniDelegateHandler : public UriHandler, public std::enable_shared_from_thi std::shared_ptr ctx, std::function()> next) override; - static bool Init(JNIEnv* j_env); - static bool Destroy(); static inline AsyncWrapperMap& GetAsyncWrapperMap() { return wrapper_map_; } diff --git a/modules/vfs/android/src/main/cpp/include/vfs/uri.h b/modules/vfs/android/src/main/cpp/include/vfs/uri.h index e0c4c53a5e4..c227c0cb893 100644 --- a/modules/vfs/android/src/main/cpp/include/vfs/uri.h +++ b/modules/vfs/android/src/main/cpp/include/vfs/uri.h @@ -41,8 +41,6 @@ class Uri { string_view GetPath(); string_view GetScheme(); string_view Normalize(); - static bool Init(); - static bool Destroy(); private: jobject j_obj_uri_; diff --git a/modules/vfs/android/src/main/cpp/src/handler/jni_delegate_handler.cc b/modules/vfs/android/src/main/cpp/src/handler/jni_delegate_handler.cc index 7c9ebd8455e..90730de082a 100644 --- a/modules/vfs/android/src/main/cpp/src/handler/jni_delegate_handler.cc +++ b/modules/vfs/android/src/main/cpp/src/handler/jni_delegate_handler.cc @@ -24,6 +24,7 @@ #include "footstone/logging.h" #include "footstone/string_view_utils.h" #include "jni/data_holder.h" +#include "jni/jni_invocation.h" #include "jni/jni_env.h" #include "jni/jni_register.h" #include "jni/jni_utils.h" @@ -72,27 +73,40 @@ std::atomic g_delegate_id = 1; constexpr char kCallFromKey[] = "__Hippy_call_from"; constexpr char kCallFromJavaValue[] = "java"; -bool JniDelegateHandler::Init(JNIEnv* j_env) { - j_util_map_clazz = reinterpret_cast(j_env->NewGlobalRef(j_env->FindClass("java/util/HashMap"))); - j_map_init_method_id = j_env->GetMethodID(j_util_map_clazz, "", "()V"); - j_map_put_method_id = j_env->GetMethodID(j_util_map_clazz, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"); +namespace { - j_vfs_manager_clazz = reinterpret_cast(j_env->NewGlobalRef(j_env->FindClass("com/tencent/vfs/VfsManager"))); - j_call_jni_delegate_sync_method_id = j_env->GetMethodID(j_vfs_manager_clazz,"doLocalTraversalsSync", - "(Ljava/lang/String;Ljava/util/HashMap;Ljava/util/HashMap;)Lcom/tencent/vfs/ResourceDataHolder;"); - j_call_jni_delegate_async_method_id = j_env->GetMethodID(j_vfs_manager_clazz, "doLocalTraversalsAsync", - "(Ljava/lang/String;Ljava/util/HashMap;Ljava/util/HashMap;I)V"); +static jint JNI_OnLoad(__unused JavaVM* j_vm, __unused void* reserved) { + auto j_env = JNIEnvironment::GetInstance()->AttachCurrentThread(); - return true; + j_util_map_clazz = + reinterpret_cast(j_env->NewGlobalRef(j_env->FindClass("java/util/HashMap"))); + j_map_init_method_id = j_env->GetMethodID(j_util_map_clazz, "", "()V"); + j_map_put_method_id = j_env->GetMethodID(j_util_map_clazz, + "put", + "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"); + + j_vfs_manager_clazz = + reinterpret_cast(j_env->NewGlobalRef(j_env->FindClass("com/tencent/vfs/VfsManager"))); + j_call_jni_delegate_sync_method_id = + j_env->GetMethodID(j_vfs_manager_clazz, "doLocalTraversalsSync", + "(Ljava/lang/String;Ljava/util/HashMap;Ljava/util/HashMap;)Lcom/tencent/vfs/ResourceDataHolder;"); + j_call_jni_delegate_async_method_id = + j_env->GetMethodID(j_vfs_manager_clazz, "doLocalTraversalsAsync", + "(Ljava/lang/String;Ljava/util/HashMap;Ljava/util/HashMap;I)V"); + + return JNI_VERSION_1_4; } -bool JniDelegateHandler::Destroy() { - JNIEnv* j_env = JNIEnvironment::GetInstance()->AttachCurrentThread(); +static void JNI_OnUnload(__unused JavaVM* j_vm, __unused void* reserved) { + auto j_env = JNIEnvironment::GetInstance()->AttachCurrentThread(); j_env->DeleteGlobalRef(j_vfs_manager_clazz); j_env->DeleteGlobalRef(j_util_map_clazz); +} + +REGISTER_JNI_ONLOAD(JNI_OnLoad) +REGISTER_JNI_ONUNLOAD(JNI_OnUnload) - return true; } JniDelegateHandler::JniDelegateHandler(JNIEnv* j_env, jobject j_delegate) { diff --git a/modules/vfs/android/src/main/cpp/src/handler/uri.cc b/modules/vfs/android/src/main/cpp/src/handler/uri.cc index e3faee4a45f..e745e12209f 100644 --- a/modules/vfs/android/src/main/cpp/src/handler/uri.cc +++ b/modules/vfs/android/src/main/cpp/src/handler/uri.cc @@ -25,6 +25,7 @@ #include "footstone/string_view_utils.h" #include "jni/jni_env.h" #include "jni/jni_utils.h" +#include "jni/jni_invocation.h" namespace hippy { inline namespace framework { @@ -47,8 +48,8 @@ std::shared_ptr Uri::Create(const string_view& uri) { return ret; } -bool Uri::Init() { - JNIEnv* j_env = JNIEnvironment::GetInstance()->AttachCurrentThread(); +static jint JNI_OnLoad(__unused JavaVM* j_vm, __unused void* reserved) { + auto j_env = JNIEnvironment::GetInstance()->AttachCurrentThread(); jclass j_local_clazz = j_env->FindClass("java/net/URI"); j_clazz = reinterpret_cast(j_env->NewGlobalRef(j_local_clazz)); j_create_method_id = j_env->GetStaticMethodID(j_clazz, "create", "(Ljava/lang/String;)Ljava/net/URI;"); @@ -56,11 +57,11 @@ bool Uri::Init() { j_to_string_method_id = j_env->GetMethodID(j_clazz, "toString", "()Ljava/lang/String;"); j_get_scheme_method_id = j_env->GetMethodID(j_clazz, "getScheme", "()Ljava/lang/String;"); j_get_path_method_id = j_env->GetMethodID(j_clazz, "getPath", "()Ljava/lang/String;"); - return true; + return JNI_VERSION_1_4; } -bool Uri::Destroy() { - JNIEnv* j_env = JNIEnvironment::GetInstance()->AttachCurrentThread(); +static void JNI_OnUnload(__unused JavaVM* j_vm, __unused void* reserved) { + auto j_env = JNIEnvironment::GetInstance()->AttachCurrentThread(); j_get_path_method_id = nullptr; j_get_scheme_method_id = nullptr; @@ -69,10 +70,11 @@ bool Uri::Destroy() { j_create_method_id = nullptr; j_env->DeleteGlobalRef(j_clazz); - - return true; } +REGISTER_JNI_ONLOAD(JNI_OnLoad) +REGISTER_JNI_ONUNLOAD(JNI_OnUnload) + Uri::Uri(const string_view& uri) { FOOTSTONE_DCHECK(uri.encoding() != string_view::Encoding::Unknown); JNIEnv* j_env = JNIEnvironment::GetInstance()->AttachCurrentThread(); diff --git a/modules/vfs/android/src/main/cpp/src/vfs_resource_holder.cc b/modules/vfs/android/src/main/cpp/src/vfs_resource_holder.cc index 27f247155d5..f75cbfedcbc 100644 --- a/modules/vfs/android/src/main/cpp/src/vfs_resource_holder.cc +++ b/modules/vfs/android/src/main/cpp/src/vfs_resource_holder.cc @@ -22,6 +22,7 @@ #include "footstone/check.h" #include "jni/jni_env.h" +#include "jni/jni_invocation.h" namespace hippy { inline namespace vfs { @@ -80,7 +81,7 @@ std::shared_ptr ResourceHolder::CreateNewHolder(jobject j_holder return ResourceHolder::Create(j_new_holder); } -bool ResourceHolder::Init() { +static jint JNI_OnLoad(__unused JavaVM* j_vm, __unused void* reserved) { JNIEnv* j_env = JNIEnvironment::GetInstance()->AttachCurrentThread(); j_resource_data_holder_clazz = reinterpret_cast( @@ -151,10 +152,10 @@ bool ResourceHolder::Init() { "onFetchCompleted", "(Lcom/tencent/vfs/ResourceDataHolder;)V"); - return true; + return JNI_VERSION_1_4; } -bool ResourceHolder::Destroy() { +static void JNI_OnUnload(__unused JavaVM* j_vm, __unused void* reserved) { JNIEnv* j_env = JNIEnvironment::GetInstance()->AttachCurrentThread(); j_env->DeleteGlobalRef(j_util_map_clazz); @@ -167,10 +168,11 @@ bool ResourceHolder::Destroy() { j_env->DeleteGlobalRef(j_request_from_local_value); j_env->DeleteGlobalRef(j_transfer_type_normal_value); j_env->DeleteGlobalRef(j_transfer_type_nio_value); - - return true; } +REGISTER_JNI_ONLOAD(JNI_OnLoad) +REGISTER_JNI_ONUNLOAD(JNI_OnUnload) + ResourceHolder::~ResourceHolder() { if (j_holder_) { JNIEnv *j_env = JNIEnvironment::GetInstance()->AttachCurrentThread(); diff --git a/renderer/native/android/src/main/cpp/CMakeLists.txt b/renderer/native/android/src/main/cpp/CMakeLists.txt index 4e5bc255d91..c098c49636b 100644 --- a/renderer/native/android/src/main/cpp/CMakeLists.txt +++ b/renderer/native/android/src/main/cpp/CMakeLists.txt @@ -51,10 +51,9 @@ target_link_libraries(${PROJECT_NAME} PRIVATE jni) # endregion # region source set -set(SOURCE_SET) +set(SOURCE_SET src/renderer/native_render_manager.cc) set(SOURCE_SET_STANDALONE - src/renderer/native_render_jni.cc - src/renderer/native_render_manager.cc) + src/renderer/native_render_jni.cc) target_sources(${PROJECT_NAME} PRIVATE ${SOURCE_SET}) # The linker treats `.a` and `.o` files are different: # * `.o` files from `.a` file only referenced `.o` object files are linked. diff --git a/renderer/native/android/src/main/cpp/include/renderer/native_render_jni.h b/renderer/native/android/src/main/cpp/include/renderer/native_render_jni.h index ab48749a1de..cfed107091c 100644 --- a/renderer/native/android/src/main/cpp/include/renderer/native_render_jni.h +++ b/renderer/native/android/src/main/cpp/include/renderer/native_render_jni.h @@ -24,17 +24,14 @@ #include +#include + +#include "jni/scoped_java_ref.h" + namespace hippy { inline namespace render { inline namespace native { -class NativeRenderJni { - public: - static void Init(); - - static void Destroy(); -}; - void OnCreateNativeRenderProvider(JNIEnv* j_env, jobject j_obj, jint j_render_manager_id, @@ -63,6 +60,11 @@ void DoCallBack(JNIEnv *j_env, jobject j_object, jint j_render_manager_id, jint j_result, jstring j_func_name, jint j_root_id, jint j_node_id, jlong j_cb_id, jbyteArray j_buffer, jint j_offset, jint j_length); +bool CreateJavaRenderManager(uint32_t id, std::shared_ptr&j_render_manager, + std::shared_ptr&render_delegate); + +float GetDensity(std::shared_ptr&j_render_manager); + } // namespace native } // namespace render } // namespace hippy diff --git a/renderer/native/android/src/main/cpp/include/renderer/native_render_manager.h b/renderer/native/android/src/main/cpp/include/renderer/native_render_manager.h index 303c65092b8..b1391479bbd 100644 --- a/renderer/native/android/src/main/cpp/include/renderer/native_render_manager.h +++ b/renderer/native/android/src/main/cpp/include/renderer/native_render_manager.h @@ -113,7 +113,7 @@ class NativeRenderManager : public RenderManager, public std::enable_shared_from private: uint32_t id_; std::shared_ptr j_render_manager_; - std::shared_ptr render_delegate_; + std::shared_ptr j_render_delegate_; std::shared_ptr serializer_; std::map> event_listener_ops_; diff --git a/renderer/native/android/src/main/cpp/src/renderer/native_render_jni.cc b/renderer/native/android/src/main/cpp/src/renderer/native_render_jni.cc index 3ccc494e453..cece02ab7ba 100644 --- a/renderer/native/android/src/main/cpp/src/renderer/native_render_jni.cc +++ b/renderer/native/android/src/main/cpp/src/renderer/native_render_jni.cc @@ -29,6 +29,8 @@ #include "dom/scene.h" #include "jni/jni_register.h" #include "jni/data_holder.h" +#include "jni/jni_invocation.h" +#include "jni/jni_env.h" #include "renderer/native_render_manager.h" @@ -45,6 +47,11 @@ namespace hippy { inline namespace render { inline namespace native { +static jclass j_render_manager_clazz; +static jmethodID j_render_manager_init_method_id; +static jmethodID j_render_manager_set_id_method_id; +static jmethodID j_render_manager_get_density_method_id; +static jmethodID j_render_manager_get_provider_method_id; REGISTER_JNI("com/tencent/renderer/NativeRenderProvider", "updateNodeSize", @@ -61,31 +68,32 @@ REGISTER_JNI("com/tencent/renderer/NativeRenderProvider", "(IILjava/lang/String;IIJ[BII)V", DoCallBack) -//REGISTER_JNI("com/tencent/renderer/NativeRenderProvider", -// "onCreateNativeRenderProvider", -// "(IF)V", -// OnCreateNativeRenderProvider) -// REGISTER_JNI("com/tencent/renderer/NativeRenderProvider", "updateRootSize", "(IIFF)V", UpdateRootSize) -void NativeRenderJni::Init() { +static jint JNI_OnLoad(__unused JavaVM* j_vm, __unused void* reserved) { + auto j_env = JNIEnvironment::GetInstance()->AttachCurrentThread(); + + j_render_manager_clazz = reinterpret_cast(j_env->NewGlobalRef( + j_env->FindClass("com/tencent/renderer/NativeRenderer"))); + j_render_manager_init_method_id = j_env->GetMethodID(j_render_manager_clazz, "", "()V"); + j_render_manager_set_id_method_id = j_env->GetMethodID(j_render_manager_clazz, "setId", "(I)V"); + j_render_manager_get_density_method_id = j_env->GetMethodID(j_render_manager_clazz, "getDensity", "()F"); + j_render_manager_get_provider_method_id = j_env->GetMethodID(j_render_manager_clazz, + "getRenderProvider", + "()Lcom/tencent/renderer/NativeRenderProvider;"); + return JNI_VERSION_1_4;; } -void NativeRenderJni::Destroy() { +static void JNI_OnUnload(__unused JavaVM* j_vm, __unused void* reserved) { + auto j_env = JNIEnvironment::GetInstance()->AttachCurrentThread(); + j_env->DeleteGlobalRef(j_render_manager_clazz); } -//void OnCreateNativeRenderProvider(JNIEnv* j_env, jobject j_object, jint j_render_manager_id, jfloat j_density) { -// auto render_manager_id = footstone::checked_numeric_cast(j_render_manager_id); -// auto& map = NativeRenderManager::PersistentMap(); -// std::shared_ptr render_manager; -// bool ret = map.Find(render_manager_id, render_manager); -// FOOTSTONE_CHECK(ret); -// render_manager->SetRenderProvider(std::make_shared(j_env, j_object)); -// render_manager->SetDensity(static_cast(j_density)); -//} +REGISTER_JNI_ONLOAD(JNI_OnLoad) +REGISTER_JNI_ONUNLOAD(JNI_OnUnload) void DestroyNativeRenderManager(JNIEnv* j_env, jobject j_object, jint j_render_manager_id) { auto& map = NativeRenderManager::PersistentMap(); @@ -95,6 +103,31 @@ void DestroyNativeRenderManager(JNIEnv* j_env, jobject j_object, jint j_render_m } } +bool CreateJavaRenderManager(uint32_t id, std::shared_ptr&j_render_manager, + std::shared_ptr&render_delegate) { + auto instance = JNIEnvironment::GetInstance(); + auto j_env = instance->AttachCurrentThread(); + auto j_manager = j_env->NewObject(j_render_manager_clazz, + j_render_manager_init_method_id); + j_render_manager = std::make_shared(j_env, j_manager); + j_env->CallVoidMethod(j_manager, + j_render_manager_set_id_method_id, + footstone::checked_numeric_cast(id)); + render_delegate = std::make_shared(j_env, + j_env->CallObjectMethod(j_manager, + j_render_manager_get_provider_method_id)); + instance->ClearJEnvException(j_env); + return true; +} + +float GetDensity(std::shared_ptr&j_render_manager) { + auto instance = JNIEnvironment::GetInstance(); + auto j_env = instance->AttachCurrentThread(); + auto j_float = j_env->CallFloatMethod(j_render_manager->GetObj(), j_render_manager_get_density_method_id); + instance->ClearJEnvException(j_env); + return static_cast(j_float); +} + jobject GetNativeRendererInstance(JNIEnv* j_env, jobject j_object, jint j_render_manager_id) { return nullptr; } diff --git a/renderer/native/android/src/main/cpp/src/renderer/native_render_manager.cc b/renderer/native/android/src/main/cpp/src/renderer/native_render_manager.cc index 32b092ce8d2..58e2ea55e4f 100644 --- a/renderer/native/android/src/main/cpp/src/renderer/native_render_manager.cc +++ b/renderer/native/android/src/main/cpp/src/renderer/native_render_manager.cc @@ -30,7 +30,8 @@ #include "footstone/macros.h" #include "dom/root_node.h" #include "jni/jni_env.h" -#include "jni/jni_load.h" +#include "jni/jni_invocation.h" +#include "renderer/native_render_jni.h" constexpr char kId[] = "id"; constexpr char kPid[] = "pId"; @@ -59,12 +60,6 @@ constexpr char kText[] = "text"; constexpr char kEnableScale[] = "enableScale"; constexpr char kNumberOfLines[] = "numberOfLines"; -static jclass j_render_manager_clazz; -static jmethodID j_render_manager_init_method_id; -static jmethodID j_render_manager_set_id_method_id; -static jmethodID j_render_manager_get_density_method_id; -static jmethodID j_render_manager_get_provider_method_id; - #define MARK_DIRTY_PROPERTY(STYLES, FIND_STYLE, NODE) \ do { \ FOOTSTONE_DCHECK(NODE != nullptr); \ @@ -88,24 +83,11 @@ NativeRenderManager::NativeRenderManager() : RenderManager("NativeRenderManager" void NativeRenderManager::CreateRenderDelegate() { persistent_map_.Insert(id_, shared_from_this()); - auto instance = JNIEnvironment::GetInstance(); - auto j_env = instance->AttachCurrentThread(); - auto j_render_manager = j_env->NewObject(j_render_manager_clazz, j_render_manager_init_method_id); - j_render_manager_ = std::make_shared(j_env, j_render_manager); - j_env->CallVoidMethod(j_render_manager, - j_render_manager_set_id_method_id, - footstone::checked_numeric_cast(id_)); - render_delegate_ = std::make_shared(j_env,j_env->CallObjectMethod( - j_render_manager, j_render_manager_get_provider_method_id)); - instance->ClearJEnvException(j_env); + FOOTSTONE_CHECK(hippy::CreateJavaRenderManager(id_, j_render_manager_, j_render_delegate_)); } void NativeRenderManager::InitDensity() { - auto instance = JNIEnvironment::GetInstance(); - auto j_env = instance->AttachCurrentThread(); - auto j_float = j_env->CallFloatMethod(j_render_manager_->GetObj(), j_render_manager_get_density_method_id); - SetDensity(static_cast(j_float)); - instance->ClearJEnvException(j_env); + density_ = hippy::GetDensity(j_render_manager_); } void NativeRenderManager::CreateRenderNode(std::weak_ptr root_node, @@ -253,7 +235,7 @@ void NativeRenderManager::DeleteRenderNode(std::weak_ptr root_node, } j_env->SetIntArrayRegion(j_int_array, 0, size, &id[0]); - jobject j_object = render_delegate_->GetObj(); + jobject j_object = j_render_delegate_->GetObj(); jclass j_class = j_env->GetObjectClass(j_object); if (!j_class) { FOOTSTONE_LOG(ERROR) << "CallNativeMethod j_class error"; @@ -323,7 +305,7 @@ void NativeRenderManager::MoveRenderNode(std::weak_ptr root_node, j_int_array = j_env->NewIntArray(j_size); j_env->SetIntArrayRegion(j_int_array, 0, j_size, &moved_ids[0]); - jobject j_object = render_delegate_->GetObj(); + jobject j_object = j_render_delegate_->GetObj(); jclass j_class = j_env->GetObjectClass(j_object); if (!j_class) { FOOTSTONE_LOG(ERROR) << "CallNativeMethod j_class error"; @@ -389,7 +371,7 @@ void NativeRenderManager::CallFunction(std::weak_ptr root_node, std::shared_ptr instance = JNIEnvironment::GetInstance(); JNIEnv* j_env = instance->AttachCurrentThread(); - jobject j_object = render_delegate_->GetObj(); + jobject j_object = j_render_delegate_->GetObj(); jclass j_class = j_env->GetObjectClass(j_object); if (!j_class) { FOOTSTONE_LOG(ERROR) << "CallJs j_class error"; @@ -457,7 +439,7 @@ void NativeRenderManager::CallNativeMethod(const std::string& method, uint32_t r j_env->SetByteArrayRegion(reinterpret_cast(j_buffer), 0, j_size, reinterpret_cast(buffer.first)); - jobject j_object = render_delegate_->GetObj(); + jobject j_object = j_render_delegate_->GetObj(); jclass j_class = j_env->GetObjectClass(j_object); if (!j_class) { FOOTSTONE_LOG(ERROR) << "CallNativeMethod j_class error"; @@ -480,7 +462,7 @@ void NativeRenderManager::CallNativeMethod(const std::string& method, uint32_t r std::shared_ptr instance = JNIEnvironment::GetInstance(); JNIEnv* j_env = instance->AttachCurrentThread(); - jobject j_object = render_delegate_->GetObj(); + jobject j_object = j_render_delegate_->GetObj(); jclass j_class = j_env->GetObjectClass(j_object); if (!j_class) { FOOTSTONE_LOG(ERROR) << "CallNativeMethod j_class error"; @@ -504,7 +486,7 @@ void NativeRenderManager::CallNativeMeasureMethod(const uint32_t root_id, const std::shared_ptr instance = JNIEnvironment::GetInstance(); JNIEnv* j_env = instance->AttachCurrentThread(); - jobject j_object = render_delegate_->GetObj(); + jobject j_object = j_render_delegate_->GetObj(); jclass j_class = j_env->GetObjectClass(j_object); if (!j_class) { FOOTSTONE_LOG(ERROR) << "CallNativeMethod j_class error"; @@ -601,25 +583,6 @@ void NativeRenderManager::MarkTextDirty(std::weak_ptr weak_root_node, } } -bool NativeRenderManagerOnLoad(JavaVM* j_vm, void* reserved, JNIEnv* j_env) { - j_render_manager_clazz = reinterpret_cast(j_env->NewGlobalRef( - j_env->FindClass("com/tencent/renderer/NativeRenderer"))); - j_render_manager_init_method_id = j_env->GetMethodID(j_render_manager_clazz, "", "()V"); - j_render_manager_set_id_method_id = j_env->GetMethodID(j_render_manager_clazz, "setId", "(I)V"); - j_render_manager_get_density_method_id = j_env->GetMethodID(j_render_manager_clazz, "getDensity", "()F"); - j_render_manager_get_provider_method_id = j_env->GetMethodID(j_render_manager_clazz, - "getRenderProvider", - "()Lcom/tencent/renderer/NativeRenderProvider;"); - return true; -} - -void NativeRenderManagerOnUnload(JavaVM* j_vm, void* reserved, JNIEnv* j_env) { - j_env->DeleteGlobalRef(j_render_manager_clazz); -} - -REGISTER_JNI_ONLOAD(NativeRenderManagerOnLoad) -REGISTER_JNI_ONUNLOAD(NativeRenderManagerOnUnload) - } // namespace native } // namespace render } // namespace hippy