Repository: incubator-weex Updated Branches: refs/heads/master 19a242971 -> 379bbdc2e
[WEEX-432][Android] Fix emoji crash on JNI. Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/379bbdc2 Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/379bbdc2 Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/379bbdc2 Branch: refs/heads/master Commit: 379bbdc2ebf4855d775f148281c8e66313bf5ee6 Parents: 19a2429 Author: miomin <[email protected]> Authored: Mon Jun 4 16:29:07 2018 +0800 Committer: YorkShen <[email protected]> Committed: Mon Jun 4 17:51:36 2018 +0800 ---------------------------------------------------------------------- android/sdk/libs/armeabi-v7a/libweexcore.so | Bin 632692 -> 636788 bytes android/sdk/libs/armeabi/libweexcore.so | Bin 644980 -> 644980 bytes android/sdk/libs/x86/libweexcore.so | Bin 1193884 -> 1202076 bytes .../main/java/com/taobao/weex/utils/WXMap.java | 29 +++++++++ .../android/bridge/impl/bridge_impl_android.cpp | 63 +++---------------- .../bridge/impl/weexcore_impl_android.cpp | 17 ++++- .../android/bridge/impl/weexcore_impl_android.h | 4 ++ 7 files changed, 56 insertions(+), 57 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/379bbdc2/android/sdk/libs/armeabi-v7a/libweexcore.so ---------------------------------------------------------------------- diff --git a/android/sdk/libs/armeabi-v7a/libweexcore.so b/android/sdk/libs/armeabi-v7a/libweexcore.so index 2d8b967..3be2444 100644 Binary files a/android/sdk/libs/armeabi-v7a/libweexcore.so and b/android/sdk/libs/armeabi-v7a/libweexcore.so differ http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/379bbdc2/android/sdk/libs/armeabi/libweexcore.so ---------------------------------------------------------------------- diff --git a/android/sdk/libs/armeabi/libweexcore.so b/android/sdk/libs/armeabi/libweexcore.so index 2de9e8b..5afdbbc 100644 Binary files a/android/sdk/libs/armeabi/libweexcore.so and b/android/sdk/libs/armeabi/libweexcore.so differ http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/379bbdc2/android/sdk/libs/x86/libweexcore.so ---------------------------------------------------------------------- diff --git a/android/sdk/libs/x86/libweexcore.so b/android/sdk/libs/x86/libweexcore.so index 5a6c37f..0c7b5d8 100644 Binary files a/android/sdk/libs/x86/libweexcore.so and b/android/sdk/libs/x86/libweexcore.so differ http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/379bbdc2/android/sdk/src/main/java/com/taobao/weex/utils/WXMap.java ---------------------------------------------------------------------- diff --git a/android/sdk/src/main/java/com/taobao/weex/utils/WXMap.java b/android/sdk/src/main/java/com/taobao/weex/utils/WXMap.java new file mode 100644 index 0000000..a3b6088 --- /dev/null +++ b/android/sdk/src/main/java/com/taobao/weex/utils/WXMap.java @@ -0,0 +1,29 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package com.taobao.weex.utils; + +import java.io.Serializable; +import java.util.HashMap; + +public class WXMap extends HashMap<String, String> implements Serializable { + + public String put(String key, byte[] value) { + return super.put(key, new String(value)); + } +} http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/379bbdc2/weex_core/Source/android/bridge/impl/bridge_impl_android.cpp ---------------------------------------------------------------------- diff --git a/weex_core/Source/android/bridge/impl/bridge_impl_android.cpp b/weex_core/Source/android/bridge/impl/bridge_impl_android.cpp index 6cea477..439d5b1 100644 --- a/weex_core/Source/android/bridge/impl/bridge_impl_android.cpp +++ b/weex_core/Source/android/bridge/impl/bridge_impl_android.cpp @@ -41,12 +41,6 @@ static jmethodID jCallRemoveElementMethodId; static jmethodID jCallMoveElementMethodId; static jmethodID jCallAddEventMethodId; static jmethodID jCallRemoveEventMethodId; - -static jmethodID jMapConstructorMethodId; -static jmethodID jMapPutMethodId; -static jmethodID jSetConstructorMethodId; -static jmethodID jSetAddMethodId; - static jmethodID jCallCreateBodyMethodId; static jmethodID jCallAddElementMethodId; static jmethodID jCallUpdateStyleMethodId; @@ -86,11 +80,6 @@ namespace WeexCore { jCallAddEventMethodId = NULL; jCallRemoveEventMethodId = NULL; - jMapConstructorMethodId = NULL; - jMapPutMethodId = NULL; - jSetConstructorMethodId = NULL; - jSetAddMethodId = NULL; - jCallCreateBodyMethodId = NULL; jCallAddElementMethodId = NULL; jCallUpdateStyleMethodId = NULL; @@ -104,33 +93,35 @@ namespace WeexCore { } void static cpyCMap2JMap(std::map<std::string, std::string> *cMap, jobject &jMap, JNIEnv *env) { + std::map<std::string, std::string>::const_iterator it = cMap->begin(); std::map<std::string, std::string>::const_iterator end = cMap->end(); jstring jKey; - jstring jValue; + jbyteArray jValue; for (; it != end; ++it) { jKey = getKeyFromCache(env, it->first.c_str()); - - jValue = env->NewStringUTF(it->second.c_str()); + jValue = newJByteArray(env, it->second.c_str()); env->CallObjectMethod(jMap, jMapPutMethodId, jKey, jValue); env->DeleteLocalRef(jValue); } } void static cpyCVector2JMap(std::vector<std::pair<std::string, std::string>> *cVector, jobject &jMap, JNIEnv *env) { + jstring jKey; - jstring jValue; + jbyteArray jValue; for (int i = 0; i < cVector->size(); ++i) { jKey = getKeyFromCache(env, (*cVector)[i].first.c_str()); - jValue = env->NewStringUTF((*cVector)[i].second.c_str()); + jValue = newJByteArray(env, (*cVector)[i].second.c_str()); env->CallObjectMethod(jMap, jMapPutMethodId, jKey, jValue); env->DeleteLocalRef(jValue); } } void static cpyCSet2JSet(std::set<std::string> *cSet, jobject &jSet, JNIEnv *env) { + jstring jValue; std::set<std::string>::const_iterator it = cSet->begin(); std::set<std::string>::const_iterator end = cSet->end(); @@ -406,17 +397,6 @@ namespace WeexCore { jstring jPageId = getKeyFromCache(env, pageId); jstring jRef = getKeyFromCache(env, ref); - if (jMapConstructorMethodId == NULL) - jMapConstructorMethodId = env->GetMethodID(jMapClazz, "<init>", "()V"); - if (jMapPutMethodId == NULL) - jMapPutMethodId = env->GetMethodID(jMapClazz, "put", - "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"); - if (jSetConstructorMethodId == NULL) - jSetConstructorMethodId = env->GetMethodID(jSetClazz, "<init>", "()V"); - if (jSetAddMethodId == NULL) - jSetAddMethodId = env->GetMethodID(jSetClazz, "add", - "(Ljava/lang/Object;)Z"); - jobject jStyles = env->NewObject(jMapClazz, jMapConstructorMethodId); jobject jAttributes = env->NewObject(jMapClazz, jMapConstructorMethodId); jobject jEvents = env->NewObject(jSetClazz, jSetConstructorMethodId); @@ -494,17 +474,6 @@ namespace WeexCore { jstring jRef = getKeyFromCache(env, ref); jstring jParentRef = getKeyFromCache(env, parentRef); - if (jMapConstructorMethodId == NULL) - jMapConstructorMethodId = env->GetMethodID(jMapClazz, "<init>", "()V"); - if (jMapPutMethodId == NULL) - jMapPutMethodId = env->GetMethodID(jMapClazz, "put", - "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"); - if (jSetConstructorMethodId == NULL) - jSetConstructorMethodId = env->GetMethodID(jSetClazz, "<init>", "()V"); - if (jSetAddMethodId == NULL) - jSetAddMethodId = env->GetMethodID(jSetClazz, "add", - "(Ljava/lang/Object;)Z"); - jobject jStyles = env->NewObject(jMapClazz, jMapConstructorMethodId); jobject jAttributes = env->NewObject(jMapClazz, jMapConstructorMethodId); jobject jEvents = env->NewObject(jSetClazz, jSetConstructorMethodId); @@ -685,12 +654,6 @@ namespace WeexCore { jstring jPageId = getKeyFromCache(env, pageId); jstring jRef = getKeyFromCache(env, ref); - if (jMapConstructorMethodId == NULL) - jMapConstructorMethodId = env->GetMethodID(jMapClazz, "<init>", "()V"); - if (jMapPutMethodId == NULL) - jMapPutMethodId = env->GetMethodID(jMapClazz, "put", - "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"); - jobject jStyles = env->NewObject(jMapClazz, jMapConstructorMethodId); jobject jMargins = env->NewObject(jMapClazz, jMapConstructorMethodId); jobject jPaddings = env->NewObject(jMapClazz, jMapConstructorMethodId); @@ -744,12 +707,6 @@ namespace WeexCore { jstring jPageId = getKeyFromCache(env, pageId); jstring jRef = getKeyFromCache(env, ref); - if (jMapConstructorMethodId == NULL) - jMapConstructorMethodId = env->GetMethodID(jMapClazz, "<init>", "()V"); - if (jMapPutMethodId == NULL) - jMapPutMethodId = env->GetMethodID(jMapClazz, "put", - "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"); - jobject jAttrs = env->NewObject(jMapClazz, jMapConstructorMethodId); if (attrs != nullptr) { @@ -868,12 +825,6 @@ namespace WeexCore { jstring jPageId = getKeyFromCache(env, pageId); jstring jRef = getKeyFromCache(env, ref); - if (jMapConstructorMethodId == NULL) - jMapConstructorMethodId = env->GetMethodID(jMapClazz, "<init>", "()V"); - if (jMapPutMethodId == NULL) - jMapPutMethodId = env->GetMethodID(jMapClazz, "put", - "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"); - jobject jStyles = env->NewObject(jMapClazz, jMapConstructorMethodId); if (style != nullptr) { http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/379bbdc2/weex_core/Source/android/bridge/impl/weexcore_impl_android.cpp ---------------------------------------------------------------------- diff --git a/weex_core/Source/android/bridge/impl/weexcore_impl_android.cpp b/weex_core/Source/android/bridge/impl/weexcore_impl_android.cpp index c73b7e7..0e5b44e 100644 --- a/weex_core/Source/android/bridge/impl/weexcore_impl_android.cpp +++ b/weex_core/Source/android/bridge/impl/weexcore_impl_android.cpp @@ -34,6 +34,11 @@ jclass jWXJSObject; jclass jWXLogUtils; jclass jMapClazz; jclass jSetClazz; +jmethodID jMapConstructorMethodId = nullptr; +jmethodID jMapPutMethodId = nullptr; +jmethodID jSetConstructorMethodId = nullptr; +jmethodID jSetAddMethodId = nullptr; + jclass jWMBridgeClazz = nullptr; jmethodID jDoubleValueMethodId; jobject jThis; @@ -529,12 +534,17 @@ jint OnLoad(JavaVM *vm, void *reserved) { tempClass = env->FindClass("com/taobao/weex/utils/WXLogUtils"); jWXLogUtils = (jclass) env->NewGlobalRef(tempClass); - tempClass = env->FindClass("java/util/HashMap"); + tempClass = env->FindClass("com/taobao/weex/utils/WXMap"); jMapClazz = (jclass) env->NewGlobalRef(tempClass); tempClass = env->FindClass("java/util/HashSet"); jSetClazz = (jclass) env->NewGlobalRef(tempClass); + jMapConstructorMethodId = env->GetMethodID(jMapClazz, "<init>", "()V"); + jMapPutMethodId = env->GetMethodID(jMapClazz, "put", "(Ljava/lang/String;[B)Ljava/lang/String;"); + jSetConstructorMethodId = env->GetMethodID(jSetClazz, "<init>", "()V"); + jSetAddMethodId = env->GetMethodID(jSetClazz, "add", "(Ljava/lang/Object;)Z"); + // can use this code to manal register jni tempClass = nullptr; tempClass = env->FindClass("com/taobao/windmill/bridge/WMLBridge"); @@ -570,6 +580,11 @@ jint OnLoad(JavaVM *vm, void *reserved) { env->DeleteGlobalRef(jWXLogUtils); env->DeleteGlobalRef(jMapClazz); + jMapConstructorMethodId = nullptr; + jMapPutMethodId = nullptr; + jSetConstructorMethodId = nullptr; + jSetAddMethodId = nullptr; + if (jFirstScreenRenderTime != nullptr) { env->DeleteLocalRef(jFirstScreenRenderTime); jFirstScreenRenderTime = nullptr; http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/379bbdc2/weex_core/Source/android/bridge/impl/weexcore_impl_android.h ---------------------------------------------------------------------- diff --git a/weex_core/Source/android/bridge/impl/weexcore_impl_android.h b/weex_core/Source/android/bridge/impl/weexcore_impl_android.h index b88256d..1b3c1a1 100644 --- a/weex_core/Source/android/bridge/impl/weexcore_impl_android.h +++ b/weex_core/Source/android/bridge/impl/weexcore_impl_android.h @@ -38,6 +38,10 @@ extern jobject jThis; extern jobject jWMThis; extern jclass jMapClazz; extern jclass jSetClazz; +extern jmethodID jMapConstructorMethodId; +extern jmethodID jMapPutMethodId; +extern jmethodID jSetConstructorMethodId; +extern jmethodID jSetAddMethodId; extern jclass jWMBridgeClazz; extern JNIEnv *getJNIEnv(); extern jstring getComponentTypeFromCache(const std::string type);
