[go: nahoru, domu]

Skip to content
This repository has been archived by the owner on Jun 3, 2021. It is now read-only.

Commit

Permalink
* [Core] Do nothing if attachThread failed (#1833)
Browse files Browse the repository at this point in the history
  • Loading branch information
Darin726 authored and YorkShen committed Nov 28, 2018
1 parent dcc7ba6 commit d303509
Show file tree
Hide file tree
Showing 5 changed files with 109 additions and 2 deletions.
5 changes: 5 additions & 0 deletions weex_core/Source/android/base/jni/android_jni.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
* under the License.
*/

#include <android/base/log_utils.h>
#include "android_jni.h"

namespace {
Expand All @@ -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;
}

Expand Down
12 changes: 12 additions & 0 deletions weex_core/Source/android/base/jni/scoped_java_ref.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand All @@ -45,13 +48,19 @@ void JavaRef::ReleaseLocalRef(JNIEnv *env) {
if (!env) {
env = AttachCurrentThread();
}
if(env == nullptr) {
return;
}
env->DeleteLocalRef(obj_);
}

void JavaRef::ResetNewGlobalRef(JNIEnv *env, jobject obj) {
if (!env) {
env = AttachCurrentThread();
}
if(env == nullptr) {
return;
}
if (obj)
obj = env->NewGlobalRef(obj);
if (obj_)
Expand All @@ -63,6 +72,9 @@ void JavaRef::ReleaseGlobalRef(JNIEnv *env) {
if (!env) {
env = AttachCurrentThread();
}
if(env == nullptr) {
return;
}
env->DeleteGlobalRef(obj_);
}

Expand Down
85 changes: 83 additions & 2 deletions weex_core/Source/android/bridge/platform/android_side.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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());
Expand All @@ -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");
Expand All @@ -110,12 +124,16 @@ std::unique_ptr<ValueWithType> 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<ValueWithType> 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<ValueWithType> ipc_result(new ValueWithType());

ipc_result->type = ParamsType::INT32;
ipc_result->value.int32Value = -1;
if (result.IsNull()) {
Expand Down Expand Up @@ -159,24 +177,36 @@ 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);
}

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");
Expand All @@ -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) {
Expand All @@ -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");
Expand All @@ -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");
Expand All @@ -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);
Expand All @@ -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);
Expand All @@ -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);
Expand All @@ -273,6 +321,9 @@ int AndroidSide::UpdateStyle(
std::vector<std::pair<std::string, std::string>> *padding,
std::vector<std::pair<std::string, std::string>> *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) {
Expand All @@ -285,6 +336,9 @@ int AndroidSide::UpdateAttr(
const char *page_id, const char *ref,
std::vector<std::pair<std::string, std::string>> *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) {
Expand All @@ -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) {
Expand All @@ -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) {
Expand All @@ -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");
Expand All @@ -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");
Expand All @@ -345,6 +411,9 @@ int AndroidSide::HasTransitionPros(
const char *page_id, const char *ref,
std::vector<std::pair<std::string, std::string>> *style) {
JNIEnv *env = base::android::AttachCurrentThread();
if(env == nullptr) {
return -1;
}
if (style == nullptr) {
return wx_bridge_->HasTransitionPros(env, page_id, ref, *style);
} else {
Expand All @@ -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);
}

Expand All @@ -382,11 +457,17 @@ std::unique_ptr<WeexJSResult> AndroidSide::DispatchMessageSync(

void AndroidSide::OnReceivedResult(long callback_id, std::unique_ptr<WeexJSResult>& 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
6 changes: 6 additions & 0 deletions weex_core/Source/android/utils/cache_utils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<std::string, jobject>(type, jGlobalType));
Expand All @@ -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) {
Expand Down
3 changes: 3 additions & 0 deletions weex_core/Source/base/message_loop/message_pump_android.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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<int64_t>(delegate))
.Release());
Expand Down

0 comments on commit d303509

Please sign in to comment.