diff --git a/weex_core/Source/android/base/jni/android_jni.cpp b/weex_core/Source/android/base/jni/android_jni.cpp index 1402e96b9b..ab5f096281 100644 --- a/weex_core/Source/android/base/jni/android_jni.cpp +++ b/weex_core/Source/android/base/jni/android_jni.cpp @@ -17,6 +17,7 @@ * under the License. */ +#include #include "android_jni.h" namespace { @@ -39,6 +40,10 @@ JNIEnv *AttachCurrentThread() { args.group = nullptr; jint ret = g_jvm->AttachCurrentThread(&env, &args); + if(ret != JNI_OK) { + LOGE("weex AttachCurrentThread failed"); + env = nullptr; + } return env; } diff --git a/weex_core/Source/android/base/jni/scoped_java_ref.cpp b/weex_core/Source/android/base/jni/scoped_java_ref.cpp index 6a4f04b8ea..099fc632ac 100644 --- a/weex_core/Source/android/base/jni/scoped_java_ref.cpp +++ b/weex_core/Source/android/base/jni/scoped_java_ref.cpp @@ -32,6 +32,9 @@ void JavaRef::ResetNewLocalRef(JNIEnv *env, jobject obj) { if (!env) { env = AttachCurrentThread(); } + if(env == nullptr) { + return; + } if (obj) { obj = env->NewLocalRef(obj); } @@ -45,6 +48,9 @@ void JavaRef::ReleaseLocalRef(JNIEnv *env) { if (!env) { env = AttachCurrentThread(); } + if(env == nullptr) { + return; + } env->DeleteLocalRef(obj_); } @@ -52,6 +58,9 @@ void JavaRef::ResetNewGlobalRef(JNIEnv *env, jobject obj) { if (!env) { env = AttachCurrentThread(); } + if(env == nullptr) { + return; + } if (obj) obj = env->NewGlobalRef(obj); if (obj_) @@ -63,6 +72,9 @@ void JavaRef::ReleaseGlobalRef(JNIEnv *env) { if (!env) { env = AttachCurrentThread(); } + if(env == nullptr) { + return; + } env->DeleteGlobalRef(obj_); } diff --git a/weex_core/Source/android/bridge/platform/android_side.cpp b/weex_core/Source/android/bridge/platform/android_side.cpp index b2809a9743..65532739b3 100644 --- a/weex_core/Source/android/bridge/platform/android_side.cpp +++ b/weex_core/Source/android/bridge/platform/android_side.cpp @@ -73,18 +73,26 @@ void AndroidSide::InvokeLayoutAfter(const char *page_id, long render_ptr, void AndroidSide::SetJSVersion(const char *version) { JNIEnv *env = base::android::AttachCurrentThread(); + if(env == nullptr) { + return; + } wx_bridge_->SetJSFrmVersion(env, version); } void AndroidSide::ReportException(const char *page_id, const char *func, const char *exception_string) { JNIEnv *env = base::android::AttachCurrentThread(); + if(env == nullptr) { + return; + } wx_bridge_->ReportException(env, page_id, func, exception_string); } void AndroidSide::ReportServerCrash(const char *instance_id) { JNIEnv *env = base::android::AttachCurrentThread(); - + if(env == nullptr) { + return; + } std::string crash_file; crash_file.assign("/crash_dump.log"); wx_bridge_->ReportServerCrash(env, instance_id, crash_file.c_str()); @@ -93,12 +101,18 @@ void AndroidSide::ReportServerCrash(const char *instance_id) { void AndroidSide::ReportNativeInitStatus(const char *status_code, const char *error_msg) { JNIEnv *env = base::android::AttachCurrentThread(); + if(env == nullptr) { + return; + } wx_bridge_->ReportNativeInitStatus(env, status_code, error_msg); } int AndroidSide::CallNative(const char *page_id, const char *task, const char *callback) { JNIEnv *env = base::android::AttachCurrentThread(); + if(env == nullptr) { + return -1; + } int flag = wx_bridge_->CallNative(env, page_id, task, callback); if (flag == -1) { LOGE("instance destroy JFM must stop callNative"); @@ -110,12 +124,16 @@ std::unique_ptr AndroidSide::CallNativeModule( const char *page_id, const char *module, const char *method, const char *arguments, int arguments_length, const char *options, int options_length) { + std::unique_ptr ipc_result(new ValueWithType()); JNIEnv *env = base::android::AttachCurrentThread(); + if(env == nullptr) { + return ipc_result; + } auto result = wx_bridge_->CallNativeModule(env, page_id, module, method, arguments, arguments_length, options, options_length); - std::unique_ptr ipc_result(new ValueWithType()); + ipc_result->type = ParamsType::INT32; ipc_result->value.int32Value = -1; if (result.IsNull()) { @@ -159,17 +177,26 @@ void AndroidSide::CallNativeComponent(const char *page_id, const char *ref, int arguments_length, const char *options, int options_length) { JNIEnv *env = base::android::AttachCurrentThread(); + if(env == nullptr) { + return; + } wx_bridge_->CallNativeComponent(env, page_id, ref, method, arguments, arguments_length, options, options_length); } void AndroidSide::SetTimeout(const char *callback_id, const char *time) { JNIEnv *env = base::android::AttachCurrentThread(); + if(env == nullptr) { + return; + } wx_bridge_->SetTimeout(env, callback_id, time); } void AndroidSide::NativeLog(const char *str_array) { JNIEnv *env = base::android::AttachCurrentThread(); + if(env == nullptr) { + return; + } LogUtils::NativeLog(env, str_array); } @@ -177,6 +204,9 @@ int AndroidSide::UpdateFinish(const char *page_id, const char *task, int taskLen, const char *callback, int callbackLen) { JNIEnv *env = base::android::AttachCurrentThread(); + if(env == nullptr) { + return -1; + } int flag = wx_bridge_->UpdateFinish(env, page_id, task, callback); if (flag == -1) { LOGE("instance destroy JFM must stop callUpdateFinish"); @@ -187,6 +217,9 @@ int AndroidSide::UpdateFinish(const char *page_id, const char *task, int AndroidSide::RefreshFinish(const char *page_id, const char *task, const char *callback) { JNIEnv *env = base::android::AttachCurrentThread(); + if(env == nullptr) { + return -1; + } int flag = wx_bridge_->RefreshFinish(env, page_id, task, callback); if (flag == -1) { @@ -198,6 +231,9 @@ int AndroidSide::RefreshFinish(const char *page_id, const char *task, int AndroidSide::AddEvent(const char *page_id, const char *ref, const char *event) { JNIEnv *env = base::android::AttachCurrentThread(); + if(env == nullptr) { + return -1; + } int flag = wx_bridge_->AddEvent(env, page_id, ref, event); if (flag == -1) { LOGE("instance destroy JFM must stop callAddEvent"); @@ -208,6 +244,9 @@ int AndroidSide::AddEvent(const char *page_id, const char *ref, int AndroidSide::RemoveEvent(const char *page_id, const char *ref, const char *event) { JNIEnv *env = base::android::AttachCurrentThread(); + if(env == nullptr) { + return -1; + } int flag = wx_bridge_->RemoveEvent(env, page_id, ref, event); if (flag == -1) { LOGE("instance destroy JFM must stop callRemoveElement"); @@ -224,6 +263,9 @@ int AndroidSide::CreateBody(const char *page_id, const char *component_type, const WXCorePadding &paddings, const WXCoreBorderWidth &borders) { JNIEnv *env = base::android::AttachCurrentThread(); + if(env == nullptr) { + return -1; + } int flag = wx_bridge_->CreateBody(env, page_id, component_type, ref, styles, attributes, events, margins, paddings, borders); @@ -242,6 +284,9 @@ int AndroidSide::AddElement(const char *page_id, const char *component_type, const WXCorePadding &paddings, const WXCoreBorderWidth &borders, bool willLayout) { JNIEnv *env = base::android::AttachCurrentThread(); + if(env == nullptr) { + return -1; + } int flag = wx_bridge_->AddElement(env, page_id, component_type, ref, index, parentRef, styles, attributes, events, margins, paddings, borders, willLayout); @@ -256,6 +301,9 @@ int AndroidSide::Layout(const char *page_id, const char *ref, float top, float bottom, float left, float right, float height, float width, int index) { JNIEnv *env = base::android::AttachCurrentThread(); + if(env == nullptr) { + return -1; + } int flag = 0; wx_bridge_->Layout(env, page_id, ref, top, bottom, left, right, height, width, index); @@ -273,6 +321,9 @@ int AndroidSide::UpdateStyle( std::vector> *padding, std::vector> *border) { JNIEnv *env = base::android::AttachCurrentThread(); + if(env == nullptr) { + return -1; + } int flag = wx_bridge_->UpdateStyle(env, page_id, ref, style, margin, padding, border); if (flag == -1) { @@ -285,6 +336,9 @@ int AndroidSide::UpdateAttr( const char *page_id, const char *ref, std::vector> *attrs) { JNIEnv *env = base::android::AttachCurrentThread(); + if(env == nullptr) { + return -1; + } int flag = 0; flag = wx_bridge_->UpdateAttr(env, page_id, ref, attrs); if (flag == -1) { @@ -295,6 +349,9 @@ int AndroidSide::UpdateAttr( int AndroidSide::CreateFinish(const char *page_id) { JNIEnv *env = base::android::AttachCurrentThread(); + if(env == nullptr) { + return -1; + } int flag = wx_bridge_->CreateFinish(env, page_id); if (flag == -1) { @@ -305,6 +362,9 @@ int AndroidSide::CreateFinish(const char *page_id) { int AndroidSide::RenderSuccess(const char *page_id) { JNIEnv *env = base::android::AttachCurrentThread(); + if(env == nullptr) { + return -1; + } int flag = wx_bridge_->RenderSuccess(env, page_id); if (flag == -1) { @@ -325,6 +385,9 @@ int AndroidSide::RemoveElement(const char *page_id, const char *ref) { int AndroidSide::MoveElement(const char *page_id, const char *ref, const char *parent_ref, int index) { JNIEnv *env = base::android::AttachCurrentThread(); + if(env == nullptr) { + return -1; + } int flag = wx_bridge_->MoveElement(env, page_id, ref, parent_ref, index); if (flag == -1) { LOGE("instance destroy JFM must stop callRemoveElement"); @@ -334,6 +397,9 @@ int AndroidSide::MoveElement(const char *page_id, const char *ref, int AndroidSide::AppendTreeCreateFinish(const char *page_id, const char *ref) { JNIEnv *env = base::android::AttachCurrentThread(); + if(env == nullptr) { + return -1; + } int flag = wx_bridge_->AppendTreeCreateFinish(env, page_id, ref); if (flag == -1) { LOGE("instance destroy JFM must stop callAppendTreeCreateFinish"); @@ -345,6 +411,9 @@ int AndroidSide::HasTransitionPros( const char *page_id, const char *ref, std::vector> *style) { JNIEnv *env = base::android::AttachCurrentThread(); + if(env == nullptr) { + return -1; + } if (style == nullptr) { return wx_bridge_->HasTransitionPros(env, page_id, ref, *style); } else { @@ -355,12 +424,18 @@ int AndroidSide::HasTransitionPros( void AndroidSide::PostMessage(const char *vm_id, const char *data, int dataLength) { JNIEnv *env = base::android::AttachCurrentThread(); + if(env == nullptr) { + return; + } wml_bridge_->PostMessage(env, vm_id, data, dataLength); } void AndroidSide::DispatchMessage(const char *client_id, const char *data, int dataLength, const char *callback, const char *vm_id) { JNIEnv *env = base::android::AttachCurrentThread(); + if(env == nullptr) { + return; + } wml_bridge_->DispatchMessage(env, client_id, data, dataLength, callback, vm_id); } @@ -382,11 +457,17 @@ std::unique_ptr AndroidSide::DispatchMessageSync( void AndroidSide::OnReceivedResult(long callback_id, std::unique_ptr& result) { JNIEnv *env = base::android::AttachCurrentThread(); + if(env == nullptr) { + return; + } wx_bridge_->OnReceivedResult(env, callback_id, result); } jobject AndroidSide::getMeasureFunc(const char *pageId, jlong renderObjectPtr) { JNIEnv *env = base::android::AttachCurrentThread(); + if(env == nullptr) { + return nullptr; + } return wx_bridge_->GetMeasureFunc(env, pageId, renderObjectPtr).Release(); } } // namespace WeexCore \ No newline at end of file diff --git a/weex_core/Source/android/utils/cache_utils.cpp b/weex_core/Source/android/utils/cache_utils.cpp index c3f52f1035..26c428b6fa 100644 --- a/weex_core/Source/android/utils/cache_utils.cpp +++ b/weex_core/Source/android/utils/cache_utils.cpp @@ -35,6 +35,9 @@ jstring getComponentTypeFromCache(const std::string type) { jstring putComponentTypeToCache(const std::string type) { JNIEnv *env = base::android::AttachCurrentThread(); + if(env == nullptr) { + return nullptr; + } jstring jType = env->NewStringUTF(type.c_str()); jobject jGlobalType = env->NewGlobalRef(jType); componentTypeCache.insert(std::pair(type, jGlobalType)); @@ -44,6 +47,9 @@ jstring putComponentTypeToCache(const std::string type) { void clearComponentTypeCache() { JNIEnv *env = base::android::AttachCurrentThread(); + if(env == nullptr) { + return; + } for (auto iter = componentTypeCache.begin(); iter != componentTypeCache.end(); iter++) { if (iter->second != nullptr) { diff --git a/weex_core/Source/base/message_loop/message_pump_android.cc b/weex_core/Source/base/message_loop/message_pump_android.cc index a4ad40892e..14bae315e1 100644 --- a/weex_core/Source/base/message_loop/message_pump_android.cc +++ b/weex_core/Source/base/message_loop/message_pump_android.cc @@ -42,6 +42,9 @@ bool MessagePumpAndroid::RegisterJNIUtils(JNIEnv* env) { void MessagePumpAndroid::Run(Delegate* delegate) { JNIEnv* env = ::base::android::AttachCurrentThread(); + if(env == nullptr) { + return; + } Reset(env, Java_SystemMessageHandler_create( env, reinterpret_cast(delegate)) .Release());