You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@weex.apache.org by ky...@apache.org on 2018/05/24 07:03:25 UTC
[10/10] incubator-weex git commit: [WEEX-378][android] wson support
for weex-core new architecture and remove rapidjson
[WEEX-378][android] wson support for weex-core new architecture and remove rapidjson
Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/50ae70ce
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/50ae70ce
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/50ae70ce
Branch: refs/heads/master
Commit: 50ae70ce89da8746ade471c84996509a5f22e91f
Parents: 162d705
Author: jianbai.gbj <ji...@alibaba-inc.com>
Authored: Fri May 18 19:22:37 2018 +0800
Committer: jianbai.gbj <ji...@alibaba-inc.com>
Committed: Thu May 24 14:52:26 2018 +0800
----------------------------------------------------------------------
.../java/com/alibaba/weex/WXApplication.java | 4 +-
.../weex/extend/module/WXWsonTestModule.java | 26 +
android/sdk/libs/armeabi-v7a/libweexjsb.so | Bin 22620 -> 22620 bytes
android/sdk/libs/armeabi-v7a/libweexjsc.so | Bin 0 -> 628596 bytes
android/sdk/libs/armeabi-v7a/libweexjss.so | Bin 3758900 -> 3758908 bytes
android/sdk/libs/armeabi/libweexjsb.so | Bin 22620 -> 22620 bytes
android/sdk/libs/armeabi/libweexjsc.so | Bin 0 -> 640884 bytes
android/sdk/libs/armeabi/libweexjss.so | Bin 3758900 -> 3758908 bytes
android/sdk/libs/x86/libweexjsb.so | Bin 3212 -> 5548 bytes
android/sdk/libs/x86/libweexjsc.so | Bin 0 -> 1185692 bytes
android/sdk/libs/x86/libweexjss.so | Bin 10990992 -> 12220172 bytes
.../java/com/taobao/weex/bridge/WXBridge.java | 49 +-
.../com/taobao/weex/bridge/WXBridgeManager.java | 36 +-
.../com/taobao/weex/bridge/WXJsFunctions.java | 42 +-
.../java/com/taobao/weex/bridge/WXParams.java | 2 +-
.../java/com/taobao/weex/common/IWXBridge.java | 1 +
.../taobao/weex/ui/component/WXComponent.java | 3 +
.../com/taobao/weex/utils/WXWsonJSONSwitch.java | 100 +
.../main/java/com/taobao/weex/wson/Wson.java | 820 ++++++
.../java/com/taobao/weex/wson/WsonUtils.java | 54 +
weex_core/Source/CMakeLists.txt | 10 +-
.../android/base/string/scoped_jstring_utf8.h | 2 -
.../Source/android/base/string/string_utils.h | 34 +-
.../android/bridge/impl/bridge_impl_android.cpp | 18 +-
.../android/bridge/impl/bridge_impl_android.h | 4 +-
.../bridge/impl/jsfunction_impl_android.cpp | 49 +-
.../native_render_object_utils_impl_android.cpp | 5 +
weex_core/Source/android/jniprebuild/jni_files | 4 +-
.../jniprebuild/jniheader/WXJsFunctions_jni.h | 24 +-
.../jsengine/multiprocess/ExtendJSApi.cpp | 41 +-
.../android/jsengine/multiprocess/WeexProxy.cpp | 209 +-
weex_core/Source/core/api/WeexJSCoreApi.cpp | 29 +-
weex_core/Source/core/api/WeexJSCoreApi.h | 6 +-
weex_core/Source/core/bridge/bridge.h | 4 +-
weex_core/Source/core/parser/dom_parser.cpp | 532 ----
weex_core/Source/core/parser/dom_parser.h | 151 -
weex_core/Source/core/parser/dom_wson.cpp | 224 ++
weex_core/Source/core/parser/dom_wson.h | 42 +
.../core/render/manager/render_manager.cpp | 34 +-
.../Source/core/render/manager/render_manager.h | 10 +-
.../Source/core/render/page/render_page.cpp | 1 -
weex_core/Source/include/WeexApiHeader.h | 34 +-
weex_core/Source/rapidjson/allocators.h | 271 --
weex_core/Source/rapidjson/document.h | 2618 ------------------
weex_core/Source/rapidjson/encodedstream.h | 299 --
weex_core/Source/rapidjson/encodings.h | 716 -----
weex_core/Source/rapidjson/error/en.h | 74 -
weex_core/Source/rapidjson/error/error.h | 161 --
weex_core/Source/rapidjson/filereadstream.h | 99 -
weex_core/Source/rapidjson/filewritestream.h | 104 -
weex_core/Source/rapidjson/fwd.h | 151 -
.../Source/rapidjson/internal/biginteger.h | 290 --
weex_core/Source/rapidjson/internal/diyfp.h | 258 --
weex_core/Source/rapidjson/internal/dtoa.h | 245 --
weex_core/Source/rapidjson/internal/ieee754.h | 78 -
weex_core/Source/rapidjson/internal/itoa.h | 304 --
weex_core/Source/rapidjson/internal/meta.h | 181 --
weex_core/Source/rapidjson/internal/pow10.h | 55 -
weex_core/Source/rapidjson/internal/regex.h | 734 -----
weex_core/Source/rapidjson/internal/stack.h | 231 --
weex_core/Source/rapidjson/internal/strfunc.h | 69 -
weex_core/Source/rapidjson/internal/strtod.h | 269 --
weex_core/Source/rapidjson/internal/swap.h | 46 -
weex_core/Source/rapidjson/istreamwrapper.h | 115 -
weex_core/Source/rapidjson/memorybuffer.h | 70 -
weex_core/Source/rapidjson/memorystream.h | 71 -
.../Source/rapidjson/msinttypes/inttypes.h | 316 ---
weex_core/Source/rapidjson/msinttypes/stdint.h | 300 --
weex_core/Source/rapidjson/ostreamwrapper.h | 81 -
weex_core/Source/rapidjson/pointer.h | 1358 ---------
weex_core/Source/rapidjson/prettywriter.h | 277 --
weex_core/Source/rapidjson/rapidjson.h | 628 -----
weex_core/Source/rapidjson/reader.h | 2221 ---------------
weex_core/Source/rapidjson/schema.h | 2026 --------------
weex_core/Source/rapidjson/stream.h | 179 --
weex_core/Source/rapidjson/stringbuffer.h | 121 -
weex_core/Source/rapidjson/writer.h | 711 -----
weex_core/Source/wson/wson.c | 345 +++
weex_core/Source/wson/wson.h | 127 +
weex_core/Source/wson/wson_parser.cpp | 306 ++
weex_core/Source/wson/wson_parser.h | 194 ++
weex_core/Source/wson/wson_util.cpp | 270 ++
weex_core/Source/wson/wson_util.h | 58 +
weex_core/debug.sh | 8 +-
weex_core/release.sh | 6 +
weex_core/trace.sh | 2 +
86 files changed, 2973 insertions(+), 16674 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/50ae70ce/android/playground/app/src/main/java/com/alibaba/weex/WXApplication.java
----------------------------------------------------------------------
diff --git a/android/playground/app/src/main/java/com/alibaba/weex/WXApplication.java b/android/playground/app/src/main/java/com/alibaba/weex/WXApplication.java
index 35fd36a..e7499f2 100644
--- a/android/playground/app/src/main/java/com/alibaba/weex/WXApplication.java
+++ b/android/playground/app/src/main/java/com/alibaba/weex/WXApplication.java
@@ -63,8 +63,8 @@ public class WXApplication extends Application {
**/
// initDebugEnvironment(true, false, "DEBUG_SERVER_HOST");
WXBridgeManager.updateGlobalConfig("wson_on");
- WXEnvironment.setOpenDebugLog(true);
- WXEnvironment.setApkDebugable(true);
+ WXEnvironment.setOpenDebugLog(false);
+ WXEnvironment.setApkDebugable(false);
WXSDKEngine.addCustomOptions("appName", "WXSample");
WXSDKEngine.addCustomOptions("appGroup", "WXApp");
WXSDKEngine.initialize(this,
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/50ae70ce/android/playground/app/src/main/java/com/alibaba/weex/extend/module/WXWsonTestModule.java
----------------------------------------------------------------------
diff --git a/android/playground/app/src/main/java/com/alibaba/weex/extend/module/WXWsonTestModule.java b/android/playground/app/src/main/java/com/alibaba/weex/extend/module/WXWsonTestModule.java
index f3fb1ff..1982080 100644
--- a/android/playground/app/src/main/java/com/alibaba/weex/extend/module/WXWsonTestModule.java
+++ b/android/playground/app/src/main/java/com/alibaba/weex/extend/module/WXWsonTestModule.java
@@ -2,10 +2,15 @@ package com.alibaba.weex.extend.module;
import android.util.Log;
+import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
+import com.taobao.weex.WXEnvironment;
import com.taobao.weex.annotation.JSMethod;
import com.taobao.weex.bridge.JSCallback;
+import com.taobao.weex.bridge.WXBridgeManager;
import com.taobao.weex.common.WXModule;
+import com.taobao.weex.utils.WXWsonJSONSwitch;
+import com.taobao.weex.wson.Wson;
/**
* Created by furture on 2018/1/18.
@@ -54,4 +59,25 @@ public class WXWsonTestModule extends WXModule {
back.put("javaJSON", back.toJSONString());
callback.invoke(back);
}
+
+ @JSMethod(uiThread = false)
+ public Object benchmark(JSONObject params) {
+ if(params == null){
+ throw new RuntimeException("params is null");
+ }//do nothing
+ return params;
+ }
+
+ @JSMethod(uiThread = false)
+ public void switchTrans(JSCallback callback) {
+ if(WXWsonJSONSwitch.USE_WSON){
+ WXBridgeManager.updateGlobalConfig("wson_off");
+ callback.invoke("wson off, use json");
+ }else{
+ WXBridgeManager.updateGlobalConfig("wson_on");
+ callback.invoke("wson on, use wson");
+ }
+ }
+
+
}
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/50ae70ce/android/sdk/libs/armeabi-v7a/libweexjsb.so
----------------------------------------------------------------------
diff --git a/android/sdk/libs/armeabi-v7a/libweexjsb.so b/android/sdk/libs/armeabi-v7a/libweexjsb.so
index f0287cf..8e3a855 100755
Binary files a/android/sdk/libs/armeabi-v7a/libweexjsb.so and b/android/sdk/libs/armeabi-v7a/libweexjsb.so differ
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/50ae70ce/android/sdk/libs/armeabi-v7a/libweexjsc.so
----------------------------------------------------------------------
diff --git a/android/sdk/libs/armeabi-v7a/libweexjsc.so b/android/sdk/libs/armeabi-v7a/libweexjsc.so
new file mode 100755
index 0000000..3e4ca8a
Binary files /dev/null and b/android/sdk/libs/armeabi-v7a/libweexjsc.so differ
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/50ae70ce/android/sdk/libs/armeabi-v7a/libweexjss.so
----------------------------------------------------------------------
diff --git a/android/sdk/libs/armeabi-v7a/libweexjss.so b/android/sdk/libs/armeabi-v7a/libweexjss.so
index 2e4f52a..dee6022 100755
Binary files a/android/sdk/libs/armeabi-v7a/libweexjss.so and b/android/sdk/libs/armeabi-v7a/libweexjss.so differ
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/50ae70ce/android/sdk/libs/armeabi/libweexjsb.so
----------------------------------------------------------------------
diff --git a/android/sdk/libs/armeabi/libweexjsb.so b/android/sdk/libs/armeabi/libweexjsb.so
index f0287cf..8e3a855 100755
Binary files a/android/sdk/libs/armeabi/libweexjsb.so and b/android/sdk/libs/armeabi/libweexjsb.so differ
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/50ae70ce/android/sdk/libs/armeabi/libweexjsc.so
----------------------------------------------------------------------
diff --git a/android/sdk/libs/armeabi/libweexjsc.so b/android/sdk/libs/armeabi/libweexjsc.so
new file mode 100644
index 0000000..f6f75bc
Binary files /dev/null and b/android/sdk/libs/armeabi/libweexjsc.so differ
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/50ae70ce/android/sdk/libs/armeabi/libweexjss.so
----------------------------------------------------------------------
diff --git a/android/sdk/libs/armeabi/libweexjss.so b/android/sdk/libs/armeabi/libweexjss.so
index 2e4f52a..dee6022 100755
Binary files a/android/sdk/libs/armeabi/libweexjss.so and b/android/sdk/libs/armeabi/libweexjss.so differ
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/50ae70ce/android/sdk/libs/x86/libweexjsb.so
----------------------------------------------------------------------
diff --git a/android/sdk/libs/x86/libweexjsb.so b/android/sdk/libs/x86/libweexjsb.so
index 89b54ae..165578b 100755
Binary files a/android/sdk/libs/x86/libweexjsb.so and b/android/sdk/libs/x86/libweexjsb.so differ
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/50ae70ce/android/sdk/libs/x86/libweexjsc.so
----------------------------------------------------------------------
diff --git a/android/sdk/libs/x86/libweexjsc.so b/android/sdk/libs/x86/libweexjsc.so
new file mode 100644
index 0000000..ac8b642
Binary files /dev/null and b/android/sdk/libs/x86/libweexjsc.so differ
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/50ae70ce/android/sdk/libs/x86/libweexjss.so
----------------------------------------------------------------------
diff --git a/android/sdk/libs/x86/libweexjss.so b/android/sdk/libs/x86/libweexjss.so
index d452b26..b5ad418 100755
Binary files a/android/sdk/libs/x86/libweexjss.so and b/android/sdk/libs/x86/libweexjss.so differ
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/50ae70ce/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridge.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridge.java b/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridge.java
index c4b7aed..c674ed6 100644
--- a/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridge.java
+++ b/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridge.java
@@ -24,6 +24,7 @@ import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.taobao.weex.WXEnvironment;
+import com.taobao.weex.WXSDKInstance;
import com.taobao.weex.WXSDKManager;
import com.taobao.weex.adapter.IWXUserTrackAdapter;
import com.taobao.weex.common.IWXBridge;
@@ -32,6 +33,7 @@ import com.taobao.weex.dom.CSSShorthand;
import com.taobao.weex.layout.ContentBoxMeasurement;
import com.taobao.weex.utils.WXExceptionUtils;
import com.taobao.weex.utils.WXLogUtils;
+import com.taobao.weex.utils.WXWsonJSONSwitch;
import java.io.Serializable;
import java.util.HashMap;
@@ -165,11 +167,25 @@ public class WXBridge implements IWXBridge {
* @param callback
*/
public int callNative(String instanceId, byte[] tasks, String callback) {
- return callNative(instanceId, new String(tasks), callback);
+ return callNative(instanceId, (JSONArray) JSON.parseArray(new String(tasks)), callback);
}
@Override
public int callNative(String instanceId, String tasks, String callback) {
+ try{
+ return callNative(instanceId, JSONArray.parseArray(tasks), callback);
+ }catch (Exception e){
+ WXLogUtils.e(TAG, "callNative throw exception: " + e.getMessage());
+ return IWXBridge.INSTANCE_RENDERING;
+ }
+ }
+
+ private int callNative(String instanceId, JSONArray tasks, String callback){
+ long start = System.currentTimeMillis();
+ WXSDKInstance instance = WXSDKManager.getInstance().getSDKInstance(instanceId);
+ if (instance != null) {
+ instance.firstScreenCreateInstanceTime(start);
+ }
int errorCode = IWXBridge.INSTANCE_RENDERING;
try {
errorCode = WXBridgeManager.getInstance().callNative(instanceId, tasks, callback);
@@ -203,16 +219,18 @@ public class WXBridge implements IWXBridge {
*/
@Override
public Object callNativeModule(String instanceId, String module, String method, byte[] arguments, byte[] options) {
- JSONArray argArray = null;
- if (arguments != null) {
- argArray = JSON.parseArray(new String(arguments));
- }
- JSONObject optionsObj = null;
- if (options != null) {
- optionsObj = JSON.parseObject(new String(options));
+ try{
+ JSONArray argArray = (JSONArray) WXWsonJSONSwitch.parseWsonOrJSON(arguments);
+ JSONObject optionsObj = null;
+ if (options != null) {
+ optionsObj = (JSONObject) WXWsonJSONSwitch.parseWsonOrJSON(options);
+ }
+ Object object = WXBridgeManager.getInstance().callNativeModule(instanceId, module, method, argArray, optionsObj);
+ return WXWsonJSONSwitch.toWsonOrJsonWXJSObject(object);
+ }catch (Exception e){
+ WXLogUtils.e(TAG, e);
+ return new WXJSObject(null);
}
- Object object = WXBridgeManager.getInstance().callNativeModule(instanceId, module, method, argArray, optionsObj);
- return new WXJSObject(object);
}
/**
@@ -225,9 +243,14 @@ public class WXBridge implements IWXBridge {
* @param options option arguments for extending
*/
@Override
- public void callNativeComponent(String instanceId, String ref, String method, byte[] arguments, byte[] options) {
- JSONArray argArray = JSON.parseArray(new String(arguments));
- WXBridgeManager.getInstance().callNativeComponent(instanceId, ref, method, argArray, options);
+ public void callNativeComponent(String instanceId, String ref, String method, byte[] arguments, byte[] optionsData) {
+ try{
+ JSONArray argArray = (JSONArray) WXWsonJSONSwitch.parseWsonOrJSON(arguments);
+ Object options = WXWsonJSONSwitch.parseWsonOrJSON(optionsData);
+ WXBridgeManager.getInstance().callNativeComponent(instanceId, ref, method, argArray, options);
+ }catch (Exception e){
+ WXLogUtils.e(TAG, e);
+ }
}
public void setTimeoutNative(String callbackId, String time) {
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/50ae70ce/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java b/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java
index f8cc404..1e4fa90 100644
--- a/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java
+++ b/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java
@@ -38,7 +38,6 @@ import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.taobao.weex.WXEnvironment;
-import com.taobao.weex.WXSDKEngine;
import com.taobao.weex.WXSDKInstance;
import com.taobao.weex.WXSDKManager;
import com.taobao.weex.adapter.IWXJSExceptionAdapter;
@@ -73,12 +72,12 @@ import com.taobao.weex.ui.action.GraphicActionUpdateAttr;
import com.taobao.weex.ui.action.GraphicActionUpdateStyle;
import com.taobao.weex.ui.action.GraphicPosition;
import com.taobao.weex.ui.action.GraphicSize;
-import com.taobao.weex.ui.component.WXComponent;
import com.taobao.weex.ui.module.WXDomModule;
import com.taobao.weex.utils.WXExceptionUtils;
import com.taobao.weex.utils.WXFileUtils;
import com.taobao.weex.utils.WXJsonUtils;
import com.taobao.weex.utils.WXLogUtils;
+import com.taobao.weex.utils.WXWsonJSONSwitch;
import com.taobao.weex.utils.WXUtils;
import com.taobao.weex.utils.WXViewUtils;
import com.taobao.weex.utils.batch.BactchExecutor;
@@ -554,8 +553,8 @@ public class WXBridgeManager implements Callback, BactchExecutor {
* @param tasks tasks to be executed
* @param callback next tick id
*/
- public int callNative(String instanceId, String tasks, String callback) {
- if (TextUtils.isEmpty(tasks)) {
+ public int callNative(String instanceId, JSONArray tasks, String callback) {
+ if (tasks == null) {
String err = "[WXBridgeManager] callNative: call Native tasks is null";
WXLogUtils.e(err);
WXExceptionUtils.commitCriticalExceptionRT(instanceId,
@@ -578,7 +577,7 @@ public class WXBridgeManager implements Callback, BactchExecutor {
long parseNanos = System.nanoTime();
- JSONArray array = JSON.parseArray(tasks);
+ JSONArray array = tasks;
parseNanos = System.nanoTime() - parseNanos;
if (null != array && array.size() > 0) {
@@ -880,7 +879,7 @@ public class WXBridgeManager implements Callback, BactchExecutor {
Object[] tasks = {task};
WXJSObject[] jsArgs = {
new WXJSObject(WXJSObject.String, instanceId),
- new WXJSObject(WXJSObject.JSON, WXJsonUtils.fromObjectToJSONString(tasks))};
+ WXWsonJSONSwitch.toWsonOrJsonWXJSObject(tasks)};
invokeExecJS(String.valueOf(instanceId), null, METHOD_CALL_JS, jsArgs, true);
jsArgs[0] = null;
jsArgs = null;
@@ -920,13 +919,13 @@ public class WXBridgeManager implements Callback, BactchExecutor {
Object[] tasks = {task};
WXJSObject[] jsArgs = {
new WXJSObject(WXJSObject.String, instanceId),
- new WXJSObject(WXJSObject.JSON, WXJsonUtils.fromObjectToJSONString(tasks))};
+ WXWsonJSONSwitch.toWsonOrJsonWXJSObject(tasks)};
byte[] taskResult = invokeExecJSWithResult(String.valueOf(instanceId), null, METHOD_CALL_JS, jsArgs, true);
if(eventCallback == null){
return;
}
if(taskResult != null){
- JSONArray arrayResult = (JSONArray) JSON.parse(new String(taskResult, "UTF-8"));
+ JSONArray arrayResult = (JSONArray) WXWsonJSONSwitch.parseWsonOrJSON(taskResult);
if(arrayResult != null && arrayResult.size() > 0){
result = arrayResult.get(0);
}
@@ -1602,7 +1601,7 @@ public class WXBridgeManager implements Callback, BactchExecutor {
private byte[] invokeExecJSWithResult(String instanceId, String namespace, String function,
WXJSObject[] args,boolean logTaskDetail){
- if (WXEnvironment.isOpenDebugLog()) {
+ if (WXEnvironment.isOpenDebugLog() && BRIDGE_LOG_SWITCH) {
mLodBuilder.append("callJS >>>> instanceId:").append(instanceId)
.append("function:").append(function);
if(logTaskDetail) {
@@ -1767,8 +1766,7 @@ public class WXBridgeManager implements Callback, BactchExecutor {
WXJSObject[] args = {
new WXJSObject(WXJSObject.String, instanceId),
- new WXJSObject(WXJSObject.JSON,
- WXJsonUtils.fromObjectToJSONString(task))};
+ WXWsonJSONSwitch.toWsonOrJsonWXJSObject(task)};
invokeExecJS(String.valueOf(instanceId), null, METHOD_CALL_JS, args);
@@ -1937,8 +1935,7 @@ public class WXBridgeManager implements Callback, BactchExecutor {
return;
}
- WXJSObject[] args = {new WXJSObject(WXJSObject.JSON,
- WXJsonUtils.fromObjectToJSONString(modules))};
+ WXJSObject[] args = {WXWsonJSONSwitch.toWsonOrJsonWXJSObject(modules)};
try {
mWXBridge.execJS("", null, METHOD_REGISTER_MODULES, args);
try {
@@ -1980,8 +1977,7 @@ public class WXBridgeManager implements Callback, BactchExecutor {
return;
}
- WXJSObject[] args = {new WXJSObject(WXJSObject.JSON,
- WXJsonUtils.fromObjectToJSONString(components))};
+ WXJSObject[] args = {WXWsonJSONSwitch.toWsonOrJsonWXJSObject(components)};
try {
mWXBridge.execJS("", null, METHOD_REGISTER_COMPONENTS, args);
} catch (Throwable e) {
@@ -2167,6 +2163,11 @@ public class WXBridgeManager implements Callback, BactchExecutor {
}
}
}
+ if(globalConfig.contains(WXWsonJSONSwitch.WSON_OFF)){
+ WXWsonJSONSwitch.USE_WSON = false;
+ }else{
+ WXWsonJSONSwitch.USE_WSON = true;
+ }
}
};
if(mBridgeManager != null && mBridgeManager.isJSFrameworkInit()){
@@ -2530,7 +2531,10 @@ public class WXBridgeManager implements Callback, BactchExecutor {
addAction.setIndex(index);
}
WXSDKManager.getInstance().getWXRenderManager().postGraphicAction(pageId, addAction);
- WXSDKManager.getInstance().getSDKInstance(pageId).removeInActiveAddElmentAction(ref);
+ WXSDKInstance instance = WXSDKManager.getInstance().getSDKInstance(pageId);
+ if(instance != null){
+ instance.removeInActiveAddElmentAction(ref);
+ }
}
else {
final BasicGraphicAction action = new GraphicActionLayout(pageId, ref, position, size);
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/50ae70ce/android/sdk/src/main/java/com/taobao/weex/bridge/WXJsFunctions.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/bridge/WXJsFunctions.java b/android/sdk/src/main/java/com/taobao/weex/bridge/WXJsFunctions.java
index 53108ef..3624f23 100644
--- a/android/sdk/src/main/java/com/taobao/weex/bridge/WXJsFunctions.java
+++ b/android/sdk/src/main/java/com/taobao/weex/bridge/WXJsFunctions.java
@@ -18,7 +18,10 @@
*/
package com.taobao.weex.bridge;
+import com.alibaba.fastjson.JSON;
import com.taobao.weex.common.IWXJsFunctions;
+import com.taobao.weex.utils.WXWsonJSONSwitch;
+import com.taobao.weex.wson.WsonUtils;
/**
* Created by darin on 27/03/2018.
@@ -37,16 +40,31 @@ public class WXJsFunctions implements IWXJsFunctions {
@Override
public native void jsHandleCallNative(String instanceId, byte[] tasks, String callback);
+
@Override
- public native void jsHandleCallNativeModule(String instanceId, String module, String method, byte[] arguments, byte[] options);
+ public void jsHandleCallNativeModule(String instanceId, String module, String method, byte[] arguments, byte[] options){
+ jsHandleCallNativeModule(instanceId, module, method,
+ WXWsonJSONSwitch.convertJSONToWsonIfUseWson(arguments), WXWsonJSONSwitch.convertJSONToWsonIfUseWson(options), true);
+ }
+
+ public native void jsHandleCallNativeModule(String instanceId, String module, String method, byte[] arguments, byte[] options, boolean h5);
@Override
- public native void jsHandleCallNativeComponent(String instanceId, String componentRef, String method, byte[] arguments, byte[] options);
+ public void jsHandleCallNativeComponent(String instanceId, String componentRef, String method, byte[] arguments, byte[] options){
+ jsHandleCallNativeComponent(instanceId, componentRef, method, arguments, options, true);
+ }
+
+
+ public native void jsHandleCallNativeComponent(String instanceId, String componentRef, String method, byte[] arguments, byte[] options, boolean from);
@Override
- public native void jsHandleCallAddElement(String instanceId, String ref, String dom, String index);
+ public void jsHandleCallAddElement(String instanceId, String ref, String dom, String index){
+ jsHandleCallAddElement(instanceId, ref, WsonUtils.toWson(JSON.parse(dom)), index, true);
+ }
+
+ public native void jsHandleCallAddElement(String instanceId, String ref, byte[] dom, String index, boolean h5);
@Override
@@ -58,7 +76,11 @@ public class WXJsFunctions implements IWXJsFunctions {
@Override
- public native void jsFunctionCallCreateBody(String pageId, String domStr);
+ public void jsFunctionCallCreateBody(String pageId, String domStr){
+ jsFunctionCallCreateBody(pageId, WsonUtils.toWson(JSON.parse(domStr)), true);
+ }
+
+ public native void jsFunctionCallCreateBody(String pageId, byte[] domStr, boolean h5);
@Override
@@ -74,11 +96,19 @@ public class WXJsFunctions implements IWXJsFunctions {
@Override
- public native void jsFunctionCallUpdateAttrs(String pageId, String ref, String data);
+ public void jsFunctionCallUpdateAttrs(String pageId, String ref, String data){
+ jsFunctionCallUpdateAttrs(pageId, ref, WsonUtils.toWson(JSON.parseObject(data)), true);
+ }
+
+ public native void jsFunctionCallUpdateAttrs(String pageId, String ref, byte[] data, boolean h5);
@Override
- public native void jsFunctionCallUpdateStyle(String pageId, String ref, String data);
+ public void jsFunctionCallUpdateStyle(String pageId, String ref, String data){
+ jsFunctionCallUpdateStyle(pageId, ref, WsonUtils.toWson(JSON.parseObject(data)), true);
+ }
+
+ public native void jsFunctionCallUpdateStyle(String pageId, String ref, byte[] data, boolean h5);
@Override
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/50ae70ce/android/sdk/src/main/java/com/taobao/weex/bridge/WXParams.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/bridge/WXParams.java b/android/sdk/src/main/java/com/taobao/weex/bridge/WXParams.java
index 495cdab..5a7081d 100644
--- a/android/sdk/src/main/java/com/taobao/weex/bridge/WXParams.java
+++ b/android/sdk/src/main/java/com/taobao/weex/bridge/WXParams.java
@@ -145,7 +145,7 @@ public class WXParams {
}
public String getUseSingleProcess() {
- WXLogUtils.e("getUseSingleProcess is running");
+ WXLogUtils.e("getUseSingleProcess is running " + useSingleProcess);
return useSingleProcess;
}
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/50ae70ce/android/sdk/src/main/java/com/taobao/weex/common/IWXBridge.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/common/IWXBridge.java b/android/sdk/src/main/java/com/taobao/weex/common/IWXBridge.java
index 092a5f3..ee9100b 100644
--- a/android/sdk/src/main/java/com/taobao/weex/common/IWXBridge.java
+++ b/android/sdk/src/main/java/com/taobao/weex/common/IWXBridge.java
@@ -105,6 +105,7 @@ public interface IWXBridge extends IWXObject {
*/
int callNative(String instanceId, byte[] tasks, String callback);
+
int callNative(String instanceId, String tasks, String callback);
void reportJSException(String instanceId, String func, String exception);
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/50ae70ce/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponent.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponent.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponent.java
index 94f4848..1463452 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponent.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponent.java
@@ -715,6 +715,9 @@ public abstract class WXComponent<T extends View> extends WXBasicComponent imple
* @return true means that the property is consumed
*/
protected boolean setProperty(String key, Object param) {
+ if(key == null){
+ return true;
+ }
switch (key) {
case Constants.Name.PREVENT_MOVE_EVENT:
if (mGesture != null) {
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/50ae70ce/android/sdk/src/main/java/com/taobao/weex/utils/WXWsonJSONSwitch.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/utils/WXWsonJSONSwitch.java b/android/sdk/src/main/java/com/taobao/weex/utils/WXWsonJSONSwitch.java
new file mode 100644
index 0000000..1904d3c
--- /dev/null
+++ b/android/sdk/src/main/java/com/taobao/weex/utils/WXWsonJSONSwitch.java
@@ -0,0 +1,100 @@
+/**
+ * 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 com.alibaba.fastjson.JSON;
+import com.taobao.weex.bridge.WXJSObject;
+import com.taobao.weex.wson.Wson;
+import com.taobao.weex.wson.WsonUtils;
+
+/**
+ * Created by furture on 2018/5/17.
+ */
+
+public class WXWsonJSONSwitch {
+
+ private static final String TAG = "WXSwitch";
+
+ /**
+ * switch input data to target according to config, if not use wson return normal data
+ * */
+ public static final byte[] convertJSONToWsonIfUseWson(byte[] json){
+ if(!USE_WSON){
+ return json;
+ }
+ if(json == null){
+ return null;
+ }
+ return WsonUtils.toWson(JSON.parse(json));
+ }
+
+ /**
+ * parse json or wson data by config switch
+ * */
+ public static final Object parseWsonOrJSON(byte[] data){
+ if(data == null){
+ return null;
+ }
+ try{
+ if(USE_WSON){
+ return Wson.parse(data);
+ }else{
+ return JSON.parse(new String(data, "UTF-8"));
+ }
+ }catch (Exception e){
+ WXLogUtils.e(TAG, e);
+ if(USE_WSON){ //fallback
+ return JSON.parse(new String(data));
+ }else{
+ return Wson.parse(data);
+ }
+ }
+ }
+
+ /**
+ * to wson or wson WXJSObject
+ * */
+ public static final WXJSObject toWsonOrJsonWXJSObject(Object tasks){
+ if(tasks == null){
+ return new WXJSObject(null);
+ }
+ if(tasks.getClass() == WXJSObject.class){
+ return (WXJSObject) tasks;
+ }
+ if(USE_WSON) {
+ return new WXJSObject(WXJSObject.WSON, Wson.toWson(tasks));
+ }else{
+ return new WXJSObject(WXJSObject.JSON, WXJsonUtils.fromObjectToJSONString(tasks));
+ }
+ }
+
+
+
+ /**
+ * config whether use json or wson, you should update this value by updateGlobalConfig(String config)
+ * in WXBridgeManager class method
+ * */
+ public static boolean USE_WSON = true;
+
+
+ /**wson off */
+ public static final String WSON_OFF = "wson_off";
+
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/50ae70ce/android/sdk/src/main/java/com/taobao/weex/wson/Wson.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/wson/Wson.java b/android/sdk/src/main/java/com/taobao/weex/wson/Wson.java
new file mode 100644
index 0000000..b8b8992
--- /dev/null
+++ b/android/sdk/src/main/java/com/taobao/weex/wson/Wson.java
@@ -0,0 +1,820 @@
+/**
+ * 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.wson;
+
+
+import android.support.v4.util.LruCache;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.annotation.JSONField;
+import com.taobao.weex.utils.WXLogUtils;
+
+import java.lang.reflect.Array;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.nio.ByteOrder;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Calendar;
+import java.util.Collection;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * fast binary json format for parse map and serialize map
+ * Created by efurture on 2017/8/16.
+ */
+public class Wson {
+
+ /**
+ * skip map null values
+ * */
+ public static final boolean WriteMapNullValue = false;
+ /**
+ * wson data type
+ * */
+ private static final byte NULL_TYPE = '0';
+
+ private static final byte STRING_TYPE = 's';
+
+ private static final byte BOOLEAN_TYPE_TRUE = 't';
+
+ private static final byte BOOLEAN_TYPE_FALSE = 'f';
+
+ private static final byte NUMBER_INT_TYPE = 'i';
+
+ private static final byte NUMBER_LONG_TYPE = 'l';
+
+ private static final byte NUMBER_BIG_INTEGER_TYPE = 'g';
+
+ private static final byte NUMBER_BIG_DECIMAL_TYPE = 'e';
+
+ private static final byte NUMBER_DOUBLE_TYPE = 'd';
+
+ private static final byte NUMBER_FLOAT_TYPE = 'F';
+
+ private static final byte ARRAY_TYPE = '[';
+
+ private static final byte MAP_TYPE = '{';
+
+ /**
+ * StringUTF-16, byte order with native byte order
+ * */
+ private static final boolean IS_NATIVE_LITTLE_ENDIAN = (ByteOrder.nativeOrder() == ByteOrder.LITTLE_ENDIAN);
+
+
+ /**
+ * parse wson data to object, please use WXJsonUtils.parseWson
+ * @param data byte array
+ * */
+ public static final Object parse(byte[] data){
+ if(data == null){
+ return null;
+ }
+ try{
+ Parser parser = new Parser(data);
+ Object object = parser.parse();
+ parser.close();
+ return object;
+ }catch (Exception e){
+ WXLogUtils.e("parseWson", e);
+ return null;
+ }
+ }
+
+
+ /**
+ * serialize object to wson data, please use WXJsonUtils.toWsonOrJsonWXJSObject
+ * */
+ public static final byte[] toWson(Object object){
+ if(object == null){
+ return null;
+ }
+ Builder builder = new Builder();
+ byte[] bts = builder.toWson(object);
+ builder.close();
+ return bts;
+ }
+
+
+ /**
+ * wson data parser
+ * */
+ private static final class Parser {
+
+ private int position = 0;
+ private byte[] buffer;
+ private char[] charsBuffer;
+
+ private Parser(byte[] buffer) {
+ this.buffer = buffer;
+ charsBuffer = localCharsBufferCache.get();
+ if(charsBuffer != null){
+ localCharsBufferCache.set(null);
+ }else{
+ charsBuffer = new char[512];
+ }
+ }
+
+
+ private final Object parse(){
+ return readObject();
+ }
+
+ private final void close(){
+ position = 0;
+ buffer = null;
+ if(charsBuffer != null){
+ localCharsBufferCache.set(charsBuffer);
+ }
+ charsBuffer = null;
+ }
+
+ private final Object readObject(){
+ byte type = readType();
+ switch (type){
+ case STRING_TYPE:
+ return readUTF16String();
+ case NUMBER_INT_TYPE :
+ return readVarInt();
+ case NUMBER_FLOAT_TYPE :
+ return readFloat();
+ case MAP_TYPE:
+ return readMap();
+ case ARRAY_TYPE:
+ return readArray();
+ case NUMBER_DOUBLE_TYPE :
+ return readDouble();
+ case NUMBER_LONG_TYPE :
+ return readLong();
+ case NUMBER_BIG_INTEGER_TYPE :
+ return new BigInteger(readUTF16String());
+ case NUMBER_BIG_DECIMAL_TYPE :
+ return new BigDecimal(readUTF16String());
+ case BOOLEAN_TYPE_FALSE:
+ return Boolean.FALSE;
+ case BOOLEAN_TYPE_TRUE:
+ return Boolean.TRUE;
+ case NULL_TYPE:
+ return null;
+ default:
+ throw new RuntimeException("wson unhandled type " + type + " " +
+ position + " length " + buffer.length);
+ }
+ }
+
+
+
+ private final Object readMap(){
+ int size = readUInt();
+ Map<String, Object> object = new JSONObject();;
+ for(int i=0; i<size; i++){
+ String key = readMapKeyUTF16();
+ Object value = readObject();
+ object.put(key, value);
+ }
+ return object;
+ }
+
+ private final Object readArray(){
+ int length = readUInt();
+ List<Object> array = new JSONArray(length);
+ for(int i=0; i<length; i++){
+ array.add(readObject());
+ }
+ return array;
+ }
+
+ private final byte readType(){
+ byte type = buffer[position];
+ position ++;
+ return type;
+ }
+
+
+ private final String readMapKeyUTF16() {
+ int length = readUInt();
+ length = length/2;
+ if(charsBuffer.length < length){
+ charsBuffer = new char[length];
+ }
+ int hash = 5381;
+ if(IS_NATIVE_LITTLE_ENDIAN){
+ for(int i=0; i<length; i++){
+ char ch = (char) ((buffer[position] & 0xFF) +
+ (buffer[position + 1] << 8));
+ charsBuffer[i] = (ch);
+ hash = ((hash << 5) + hash) + ch;
+ position+=2;
+ }
+ }else{
+ for(int i=0; i<length; i++){
+ char ch = (char) ((buffer[position + 1] & 0xFF) +
+ (buffer[position] << 8));
+ charsBuffer[i] = (ch);
+ hash = ((hash << 5) + hash) + ch;
+ position+=2;
+ }
+ }
+ int globalIndex = (globalStringBytesCache.length - 1)&hash;
+ String cache = globalStringBytesCache[globalIndex];
+ if(cache != null
+ && cache.length() == length){
+ boolean isStringEqual = true;
+ for(int i=0; i<length; i++){
+ if(charsBuffer[i] != cache.charAt(i)){
+ isStringEqual = false;
+ break;
+ }
+ }
+ if(isStringEqual) {
+ return cache;
+ }
+ }
+ cache = new String(charsBuffer, 0, length);
+ if(length < 64) {
+ globalStringBytesCache[globalIndex] = cache;
+ }
+ return cache;
+ }
+
+ private final String readUTF16String(){
+ int length = readUInt()/2;
+ if(charsBuffer.length < length){
+ charsBuffer = new char[length];
+ }
+ if(IS_NATIVE_LITTLE_ENDIAN){
+ for(int i=0; i<length; i++){
+ char ch = (char) ((buffer[position] & 0xFF) +
+ (buffer[position + 1] << 8));
+ charsBuffer[i] = (ch);
+ position+=2;
+ }
+ }else{
+ for(int i=0; i<length; i++){
+ char ch = (char) ((buffer[position + 1] & 0xFF) +
+ (buffer[position] << 8));
+ charsBuffer[i] = (ch);
+ position+=2;
+ }
+ }
+ return new String(charsBuffer, 0, length);
+ }
+
+
+
+
+
+ private final int readVarInt(){
+ int raw = readUInt();
+ // This undoes the trick in putVarInt()
+ int num = (((raw << 31) >> 31) ^ raw) >> 1;
+ // This extra step lets us deal with the largest signed values by treating
+ // negative results from read unsigned methods as like unsigned values.
+ // Must re-flip the top bit if the original read value had it set.
+ return num ^ (raw & (1 << 31));
+ }
+
+ private final int readUInt(){
+ int value = 0;
+ int i = 0;
+ int b;
+ while (((b = buffer[position]) & 0x80) != 0) {
+ value |= (b & 0x7F) << i;
+ i += 7;
+ position+=1;
+ if (i > 35) {
+ throw new IllegalArgumentException("Variable length quantity is too long");
+ }
+ }
+ position+=1;
+ return value | (b << i);
+ }
+
+ private final long readLong(){
+ long number = (((buffer[position + 7] & 0xFFL) ) +
+ ((buffer[position + 6] & 0xFFL) << 8) +
+ ((buffer[position + 5] & 0xFFL) << 16) +
+ ((buffer[position + 4] & 0xFFL) << 24) +
+ ((buffer[position + 3] & 0xFFL) << 32) +
+ ((buffer[position + 2] & 0xFFL) << 40) +
+ ((buffer[position + 1] & 0xFFL) << 48) +
+ (((long) buffer[position]) << 56));
+ position += 8;
+ return number;
+ }
+
+ private final Object readDouble(){
+ double number = Double.longBitsToDouble(readLong());
+ if(number > Integer.MAX_VALUE){
+ long numberLong = (long) number;
+ double doubleLong = (numberLong);
+ if(number - doubleLong < Double.MIN_NORMAL){
+ return numberLong;
+ }
+ }
+ return number;
+ }
+
+ private Object readFloat() {
+ int number = (((buffer[position + 3] & 0xFF) ) +
+ ((buffer[position + 2] & 0xFF) << 8) +
+ ((buffer[position + 1] & 0xFF) << 16) +
+ ((buffer[position ] & 0xFF) << 24));
+ position +=4;
+ return Float.intBitsToFloat(number);
+ }
+ }
+
+ /**
+ * wson builder
+ * */
+ private static final class Builder {
+
+ private byte[] buffer;
+ private int position;
+ private ArrayList refs;
+ private final static ThreadLocal<byte[]> bufLocal = new ThreadLocal<byte[]>();
+ private final static ThreadLocal<ArrayList> refsLocal = new ThreadLocal<ArrayList>();
+
+
+
+ private Builder(){
+ buffer = bufLocal.get();
+ if(buffer != null) {
+ bufLocal.set(null);
+ }else{
+ buffer = new byte[1024];
+ }
+ refs = refsLocal.get();
+ if(refs != null){
+ refsLocal.set(null);
+ }else{
+ refs = new ArrayList<>(16);
+ }
+ }
+
+
+ private final byte[] toWson(Object object){
+ writeObject(object);
+ byte[] bts = new byte[position];
+ System.arraycopy(buffer, 0, bts, 0, position);
+ return bts;
+ }
+
+ private final void close(){
+ if(buffer.length <= 1024*16){
+ bufLocal.set(buffer);
+ }
+ if(refs.isEmpty()){
+ refsLocal.set(refs);
+ }else{
+ refs.clear();
+ }
+ refs = null;
+ buffer = null;
+ position = 0;
+ }
+
+ private final void writeObject(Object object) {
+ if(object instanceof CharSequence){
+ ensureCapacity(2);
+ writeByte(STRING_TYPE);
+ writeUTF16String((CharSequence) object);
+ return;
+ }else if (object instanceof Map){
+ if(refs.contains(object)){
+ ensureCapacity(2);
+ writeByte(NULL_TYPE);
+ return;
+ }
+ refs.add(object);
+ Map map = (Map) object;
+ writeMap(map);
+ refs.remove(refs.size()-1);
+ return;
+ }else if (object instanceof List){
+ if(refs.contains(object)){
+ ensureCapacity(2);
+ writeByte(NULL_TYPE);
+ return;
+ }
+ refs.add(object);
+ ensureCapacity(8);
+ List list = (List) object;
+ writeByte(ARRAY_TYPE);
+ writeUInt(list.size());
+ for(Object value : list){
+ writeObject(value);
+ }
+ refs.remove(refs.size()-1);
+ return;
+ }else if (object instanceof Number){
+ Number number = (Number) object;
+ writeNumber(number);
+ return;
+ }else if (object instanceof Boolean){
+ ensureCapacity(2);
+ Boolean value = (Boolean) object;
+ if(value){
+ writeByte(BOOLEAN_TYPE_TRUE);
+ }else{
+ writeByte(BOOLEAN_TYPE_FALSE);
+ }
+ return;
+ }else if(object == null){
+ ensureCapacity(2);
+ writeByte(NULL_TYPE);
+ return;
+ }else if (object.getClass().isArray()){
+ if(refs.contains(object)){
+ ensureCapacity(2);
+ writeByte(NULL_TYPE);
+ return;
+ }
+ refs.add(object);
+ ensureCapacity(8);
+ int length = Array.getLength(object);
+ writeByte(ARRAY_TYPE);
+ writeUInt(length);
+ for(int i=0; i<length; i++){
+ Object value = Array.get(object, i);
+ writeObject(value);
+ }
+ refs.remove(refs.size()-1);
+ return;
+ }else if(object instanceof Date){
+ ensureCapacity(10);
+ double date = ((Date)object).getTime();
+ writeByte(NUMBER_DOUBLE_TYPE);
+ writeDouble(date);
+ }else if(object instanceof Calendar){
+ ensureCapacity(10);
+ double date = ((Calendar)object).getTime().getTime();
+ writeByte(NUMBER_DOUBLE_TYPE);
+ writeDouble(date);
+ }else if(object instanceof Collection){
+ if(refs.contains(object)){
+ ensureCapacity(2);
+ writeByte(NULL_TYPE);
+ return;
+ }
+ refs.add(object);
+ ensureCapacity(8);
+ Collection list = (Collection) object;
+ writeByte(ARRAY_TYPE);
+ writeUInt(list.size());
+ for(Object value : list){
+ writeObject(value);
+ }
+ refs.remove(refs.size()-1);
+ }else{
+ if(refs.contains(object)){
+ ensureCapacity(2);
+ writeByte(NULL_TYPE);
+ }else {
+ refs.add(object);
+ if(object.getClass().isEnum()){
+ writeObject(JSON.toJSONString(object));
+ }else{
+ writeAdapterObject(object);
+ }
+ refs.remove(refs.size()-1);
+ }
+ return;
+ }
+ }
+
+ private final void writeNumber(Number number) {
+ ensureCapacity(12);
+ if(number instanceof Integer){
+ writeByte(NUMBER_INT_TYPE);
+ writeVarInt(number.intValue());
+ return;
+ }
+
+ if(number instanceof Float){
+ writeByte(NUMBER_FLOAT_TYPE);
+ writeFloat(number.floatValue());
+ return;
+ }
+ if(number instanceof Double){
+ writeByte(NUMBER_DOUBLE_TYPE);
+ writeDouble(number.doubleValue());
+ return;
+ }
+
+ if(number instanceof Long){
+ writeByte(NUMBER_LONG_TYPE);
+ writeLong(number.longValue());
+ return;
+ }
+
+ if(number instanceof Short
+ || number instanceof Byte){
+ writeByte(NUMBER_INT_TYPE);
+ writeVarInt(number.intValue());
+ return;
+ }
+
+ if(number instanceof BigInteger){
+ writeByte(NUMBER_BIG_INTEGER_TYPE);
+ writeUTF16String(number.toString());
+ return;
+ }
+
+ if(number instanceof BigDecimal){
+ String value = number.toString();
+ double doubleValue = number.doubleValue();
+ if(value.equals(Double.toString(doubleValue))){
+ writeByte(NUMBER_DOUBLE_TYPE);
+ writeDouble(doubleValue);
+ }else {
+ writeByte(NUMBER_BIG_DECIMAL_TYPE);
+ writeUTF16String(value);
+ }
+ return;
+ }
+ writeByte(STRING_TYPE);
+ writeUTF16String(number.toString());
+
+ }
+
+ private final void writeMap(Map map) {
+ if(WriteMapNullValue){
+ ensureCapacity(8);
+ writeByte(MAP_TYPE);
+ writeUInt(map.size());
+ Set<Map.Entry<Object,Object>> entries = map.entrySet();
+ for(Map.Entry<Object,Object> entry : entries){
+ writeMapKeyUTF16(entry.getKey().toString());
+ writeObject(entry.getValue());
+ }
+ }else{
+ Set<Map.Entry<Object,Object>> entries = map.entrySet();
+ int nullValueSize = 0;
+ for(Map.Entry<Object,Object> entry : entries){
+ if(entry.getValue() == null){
+ nullValueSize++;
+ }
+ }
+
+ ensureCapacity(8);
+ writeByte(MAP_TYPE);
+ writeUInt(map.size()-nullValueSize);
+ for(Map.Entry<Object,Object> entry : entries){
+ if(entry.getValue() == null){
+ continue;
+ }
+ writeMapKeyUTF16(entry.getKey().toString());
+ writeObject(entry.getValue());
+ }
+ }
+ }
+
+
+ private final void writeByte(byte type){
+ buffer[position] = type;
+ position++;
+ }
+
+ private final void writeAdapterObject(Object object){
+ if(specialClass.get(object.getClass().getName()) != null){
+ writeObject(JSON.toJSON(object));
+ return;
+ }
+ try{
+ writeMap(toMap(object));
+ }catch (Exception e){
+ specialClass.put(object.getClass().getName(), true);
+ writeObject(JSON.toJSON(object));
+ }
+ }
+
+ private final Map toMap(Object object){
+ Map map = new JSONObject();
+ try {
+ Class<?> targetClass = object.getClass();
+ String key = targetClass.getName();
+ List<Method> methods = getBeanMethod(key, targetClass);
+ for (Method method : methods) {
+ String methodName = method.getName();
+ if (methodName.startsWith(METHOD_PREFIX_GET)) {
+ Object value = method.invoke(object);
+ if(value != null){
+ StringBuilder builder = new StringBuilder(method.getName().substring(3));
+ builder.setCharAt(0, Character.toLowerCase(builder.charAt(0)));
+ map.put(builder.toString(), (Object) value);
+ }
+ }else if(methodName.startsWith(METHOD_PREFIX_IS)){
+ Object value = method.invoke(object);
+ if(value != null){
+ StringBuilder builder = new StringBuilder(method.getName().substring(2));
+ builder.setCharAt(0, Character.toLowerCase(builder.charAt(0)));
+ map.put(builder.toString(), value);
+ }
+ }
+ }
+ List<Field> fields = getBeanFields(key, targetClass);
+ for(Field field : fields){
+ String fieldName = field.getName();
+ if(map.containsKey(fieldName)){
+ continue;
+ }
+ Object value = field.get(object);
+ if(value == null){
+ continue;
+ }
+ map.put(fieldName, value);
+ }
+ }catch (Exception e){
+ if(e instanceof RuntimeException){
+ throw (RuntimeException)e;
+ }else{
+ throw new RuntimeException(e);
+ }
+ }
+ return map;
+ }
+
+ private final void writeMapKeyUTF16(String value){
+ writeUTF16String(value);
+ }
+
+
+
+
+ /**
+ * writeString UTF-16
+ * */
+ private final void writeUTF16String(CharSequence value){
+ int length = value.length();
+ ensureCapacity(length*2 + 8);
+ writeUInt(length*2);
+ if(IS_NATIVE_LITTLE_ENDIAN){
+ for(int i=0; i<length; i++){
+ char ch = value.charAt(i);
+ buffer[position] = (byte) (ch);
+ buffer[position+1] = (byte) (ch >>> 8);
+ position+=2;
+ }
+ }else{
+ for(int i=0; i<length; i++){
+ char ch = value.charAt(i);
+ buffer[position + 1] = (byte) (ch );
+ buffer[position] = (byte) (ch >>> 8);
+ position+=2;
+ }
+ }
+ }
+
+
+ private final void writeDouble(double value){
+ writeLong(Double.doubleToLongBits(value));
+ }
+
+ private final void writeFloat(float value){
+ int val = Float.floatToIntBits(value);
+ buffer[position + 3] = (byte) (val );
+ buffer[position + 2] = (byte) (val >>> 8);
+ buffer[position + 1] = (byte) (val >>> 16);
+ buffer[position ] = (byte) (val >>> 24);
+ position += 4;
+ }
+
+ private final void writeLong(long val){
+ buffer[position + 7] = (byte) (val );
+ buffer[position + 6] = (byte) (val >>> 8);
+ buffer[position + 5] = (byte) (val >>> 16);
+ buffer[position + 4] = (byte) (val >>> 24);
+ buffer[position + 3] = (byte) (val >>> 32);
+ buffer[position + 2] = (byte) (val >>> 40);
+ buffer[position + 1] = (byte) (val >>> 48);
+ buffer[position ] = (byte) (val >>> 56);
+ position += 8;
+ }
+
+ private final void writeVarInt(int value){
+ writeUInt((value << 1) ^ (value >> 31));
+ }
+
+ private final void writeUInt(int value){
+ while ((value & 0xFFFFFF80) != 0) {
+ buffer[position] = (byte)((value & 0x7F) | 0x80);
+ position++;
+ value >>>= 7;
+ }
+ buffer[position] = (byte)(value & 0x7F);
+ position++;
+ }
+
+
+ private final void ensureCapacity(int minCapacity) {
+ minCapacity += position;
+ // overflow-conscious code
+ if (minCapacity - buffer.length > 0){
+ int oldCapacity = buffer.length;
+ int newCapacity = oldCapacity << 1;
+ if(newCapacity < 1024*16){
+ newCapacity = 1024*16;
+ }
+ if (newCapacity - minCapacity < 0) {
+ newCapacity = minCapacity;
+ }
+ buffer = Arrays.copyOf(buffer, newCapacity);
+ }
+ }
+ }
+
+
+ /**
+ * cache json property key, most of them all same
+ * */
+ private static final int GLOBAL_STRING_CACHE_SIZE = 2*1024;
+ private static final ThreadLocal<char[]> localCharsBufferCache = new ThreadLocal<>();
+ private static final String[] globalStringBytesCache = new String[GLOBAL_STRING_CACHE_SIZE];
+
+
+
+
+ /**
+ * lru cache, to map helper
+ * */
+ private static final String METHOD_PREFIX_GET = "get";
+ private static final String METHOD_PREFIX_IS = "is";
+ private static LruCache<String, List<Method>> methodsCache = new LruCache<>(128);
+ private static LruCache<String, List<Field>> fieldsCache = new LruCache<>(128);
+ private static LruCache<String, Boolean> specialClass = new LruCache<>(16);
+
+
+ private static final List<Method> getBeanMethod(String key, Class targetClass){
+ List<Method> methods = methodsCache.get(key);
+ if(methods == null){
+ methods = new ArrayList<>();
+ Method[] allMethods = targetClass.getMethods();
+ for(Method method : allMethods){
+ if(method.getDeclaringClass() == Object.class){
+ continue;
+ }
+ if( (method.getModifiers() & Modifier.STATIC) != 0){
+ continue;
+ }
+ String methodName = method.getName();
+ if(methodName.startsWith(METHOD_PREFIX_GET)
+ || methodName.startsWith(METHOD_PREFIX_IS)) {
+ if(method.getAnnotation(JSONField.class) != null){
+ throw new UnsupportedOperationException("getBeanMethod JSONField Annotation Not Handled, Use toJSON");
+ }
+ methods.add(method);
+ }
+ }
+ methodsCache.put(key, methods);
+ }
+ return methods;
+ }
+
+
+
+ private static final List<Field> getBeanFields(String key, Class targetClass){
+ List<Field> fieldList = fieldsCache.get(key);
+ if(fieldList == null) {
+ Field[] fields = targetClass.getFields();
+ fieldList = new ArrayList<>(fields.length);
+ for(Field field : fields){
+ if((field.getModifiers() & Modifier.STATIC) != 0){
+ continue;
+ }
+ if(field.getAnnotation(JSONField.class) != null){
+ throw new UnsupportedOperationException("getBeanMethod JSONField Annotation Not Handled, Use toJSON");
+ }
+ fieldList.add(field);
+ }
+ fieldsCache.put(key, fieldList);
+ }
+ return fieldList;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/50ae70ce/android/sdk/src/main/java/com/taobao/weex/wson/WsonUtils.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/wson/WsonUtils.java b/android/sdk/src/main/java/com/taobao/weex/wson/WsonUtils.java
new file mode 100644
index 0000000..dc51438
--- /dev/null
+++ b/android/sdk/src/main/java/com/taobao/weex/wson/WsonUtils.java
@@ -0,0 +1,54 @@
+/**
+ * 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.wson;
+
+import com.taobao.weex.utils.WXLogUtils;
+
+/**
+ * Created by furture on 2018/5/17.
+ */
+
+public class WsonUtils {
+ /**
+ * total entry, with wson support, always parse json
+ * */
+ public static final Object parseWson(byte[] data){
+ if(data == null){
+ return null;
+ }
+ try{
+ return Wson.parse(data);
+ }catch (Exception e){
+ WXLogUtils.e("weex wson parse error ", e);
+ return null;
+ }
+ }
+
+ public static final byte[] toWson(Object data){
+ if(data == null){
+ return null;
+ }
+ try{
+ return Wson.toWson(data);
+ }catch (Exception e){
+ WXLogUtils.e("weex wson to wson error ", e);
+ return null;
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/50ae70ce/weex_core/Source/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/weex_core/Source/CMakeLists.txt b/weex_core/Source/CMakeLists.txt
index d2d41d7..53d70e5 100644
--- a/weex_core/Source/CMakeLists.txt
+++ b/weex_core/Source/CMakeLists.txt
@@ -39,8 +39,6 @@ set(COMMON_SRCS
./core/render/action/render_action_update_attr.cpp
./core/render/action/render_action_update_style.cpp
- ./core/parser/dom_parser.cpp
-
./core/layout/layout.cpp
./core/layout/style.cpp
@@ -53,6 +51,9 @@ set(COMMON_SRCS
if (ANDROID)
set (ANDROID_SRCS
+ ./wson/wson.c
+ ./wson/wson_util.cpp
+ ./wson/wson_parser.cpp
./android/jniprebuild/jni_load.cc
./android/base/jni/android_jni.cpp
./android/base/jni/scoped_java_ref.cpp
@@ -71,6 +72,11 @@ if (ANDROID)
./android/jsengine/multiprocess/WeexJSConnection.cpp
./android/jsengine/multiprocess/WeexProxy.cpp
./android/jsengine/multiprocess/ExtendJSApi.cpp
+
+
+ ./core/parser/dom_wson.cpp
+
+
)
add_library(${WEEXCORE_LIBRARY_NAME} SHARED
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/50ae70ce/weex_core/Source/android/base/string/scoped_jstring_utf8.h
----------------------------------------------------------------------
diff --git a/weex_core/Source/android/base/string/scoped_jstring_utf8.h b/weex_core/Source/android/base/string/scoped_jstring_utf8.h
index ccf2d18..fa739ba 100644
--- a/weex_core/Source/android/base/string/scoped_jstring_utf8.h
+++ b/weex_core/Source/android/base/string/scoped_jstring_utf8.h
@@ -19,12 +19,10 @@
#ifndef _SCOPED_JSTRING_UTF_8_H_
#define _SCOPED_JSTRING_UTF_8_H_
-#include <locale.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include <thread>
#include <type_traits>
#include "../base64/base64.h"
#include <jni.h>
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/50ae70ce/weex_core/Source/android/base/string/string_utils.h
----------------------------------------------------------------------
diff --git a/weex_core/Source/android/base/string/string_utils.h b/weex_core/Source/android/base/string/string_utils.h
index fd29371..ae3d5f5 100644
--- a/weex_core/Source/android/base/string/string_utils.h
+++ b/weex_core/Source/android/base/string/string_utils.h
@@ -89,6 +89,18 @@ static std::string jByteArray2Str(JNIEnv *env, jbyteArray barr) {
}
+
+static inline jbyteArray newJByteArray(JNIEnv *env, const char* data, int length) {
+ jbyteArray jarray = nullptr;
+ if (data == nullptr || length <= 0)
+ return jarray;
+ int byteSize = length;
+ jbyte *jb = (jbyte*) data;
+ jarray = env->NewByteArray(byteSize);
+ env->SetByteArrayRegion(jarray, 0, byteSize, jb);
+ return jarray;
+}
+
static inline jbyteArray newJByteArray(JNIEnv *env, const char* pat) {
jbyteArray jarray = nullptr;
if (pat == nullptr)
@@ -116,15 +128,23 @@ static inline char* getArumentAsCStr(IPCArguments *arguments, int argument) {
const IPCByteArray *ipcBA = arguments->getByteArray(argument);
int strLen = ipcBA->length;
ret = new char[strLen+1];
- for (int i = 0; i < strLen; ++i) {
- ret[i] = ipcBA->content[i];
- }
+ memcpy(ret, ipcBA->content, strLen);
ret[strLen] = '\0';
}
return ret;
}
+static inline int getArumentAsCStrLen(IPCArguments *arguments, int argument) {
+ if (argument >= arguments->getCount())
+ return 0;
+ if (arguments->getType(argument) == IPCType::BYTEARRAY) {
+ const IPCByteArray *ipcBA = arguments->getByteArray(argument);
+ return ipcBA->length;
+ }
+ return 0;
+}
+
static inline jbyteArray getArgumentAsJByteArray(JNIEnv* env, IPCArguments* arguments, size_t argument)
{
jbyteArray ba = nullptr;
@@ -176,5 +196,13 @@ static inline void addJSONString(JNIEnv *env, IPCSerializer *serializer, jstring
size_t charsLength = scopedString.getCharsLength();
serializer->addJSON(chars, charsLength);
}
+
+static void addBinaryByteArray(JNIEnv* env, IPCSerializer* serializer, jbyteArray array)
+{
+ size_t length = env->GetArrayLength(array);
+ jbyte* data = env->GetByteArrayElements(array, 0);
+ serializer->add((const char*)data, length);
+ env->ReleaseByteArrayElements(array, data, 0);
+}
}
#endif //_STRING_UTILS_H_
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/50ae70ce/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 dbff771..fa230cd 100644
--- a/weex_core/Source/android/bridge/impl/bridge_impl_android.cpp
+++ b/weex_core/Source/android/bridge/impl/bridge_impl_android.cpp
@@ -221,17 +221,16 @@ namespace WeexCore {
}
jobject Bridge_Impl_Android::callNativeModule(const char* pageId, const char *module, const char *method,
- const char *argString, const char *optString) {
+ const char *arguments, int argumentsLen, const char *options, int optionsLen) {
RenderPage *page = RenderManager::GetInstance()->GetPage(pageId);
long long startTime = getCurrentTime();
JNIEnv *env = getJNIEnv();
jstring jModule = env->NewStringUTF(module);
jstring jMethod = env->NewStringUTF(method);
- jbyteArray jArgString = newJByteArray(env, argString);
- jbyteArray jOptString = newJByteArray(env, optString);
+ jbyteArray jArgString = newJByteArray(env, arguments, argumentsLen);
+ jbyteArray jOptString = newJByteArray(env, options, optionsLen);
jstring jPageId = getKeyFromCache(env, pageId);
-
jobject result = nullptr;
if (jModule != nullptr && jMethod != nullptr) {
@@ -258,16 +257,15 @@ namespace WeexCore {
return result;
}
- void Bridge_Impl_Android::callNativeComponent(const char* pageId, const char* ref,
- const char *method, const char *argString,
- const char *optString) {
+ void Bridge_Impl_Android::callNativeComponent(const char* pageId, const char* ref, const char *method,
+ const char *arguments, int argumentsLength, const char *options, int optionsLength) {
RenderPage *page = RenderManager::GetInstance()->GetPage(pageId);
long long startTime = getCurrentTime();
JNIEnv *env = getJNIEnv();
jstring jMethod = env->NewStringUTF(method);
- jbyteArray jArgString = newJByteArray(env, argString);
- jbyteArray jOptString = newJByteArray(env, optString);
+ jbyteArray jArgString = newJByteArray(env, arguments, argumentsLength);
+ jbyteArray jOptString = newJByteArray(env, options, optionsLength);
jstring jPageId = getKeyFromCache(env, pageId);
jstring jRef = getKeyFromCache(env, ref);
@@ -929,4 +927,4 @@ namespace WeexCore {
}
return env->CallObjectMethod(jThis, jCallGetMeasurementMethodId, jPageId, jRef);
}
-} //end WeexCore
\ No newline at end of file
+} //end WeexCore
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/50ae70ce/weex_core/Source/android/bridge/impl/bridge_impl_android.h
----------------------------------------------------------------------
diff --git a/weex_core/Source/android/bridge/impl/bridge_impl_android.h b/weex_core/Source/android/bridge/impl/bridge_impl_android.h
index 50c8ba0..0272ae5 100644
--- a/weex_core/Source/android/bridge/impl/bridge_impl_android.h
+++ b/weex_core/Source/android/bridge/impl/bridge_impl_android.h
@@ -69,10 +69,10 @@ namespace WeexCore {
int callNative(const char* pageId, const char *task, const char *callback);
jobject callNativeModule(const char* pageId, const char *module, const char *method,
- const char *argString, const char *optString);
+ const char *arguments, int argumentsLength, const char *options, int optionsLength);
void callNativeComponent(const char* pageId, const char* ref, const char *method,
- const char *argString, const char *optString);
+ const char *arguments, int argumentsLength, const char *options, int optionsLength);
void setTimeout(const char* callbackID, const char* time);
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/50ae70ce/weex_core/Source/android/bridge/impl/jsfunction_impl_android.cpp
----------------------------------------------------------------------
diff --git a/weex_core/Source/android/bridge/impl/jsfunction_impl_android.cpp b/weex_core/Source/android/bridge/impl/jsfunction_impl_android.cpp
index d81c144..e5e89af 100644
--- a/weex_core/Source/android/bridge/impl/jsfunction_impl_android.cpp
+++ b/weex_core/Source/android/bridge/impl/jsfunction_impl_android.cpp
@@ -41,6 +41,15 @@ static const char *getCharFromJByte(JNIEnv *env, jbyteArray jbyteArray1) {
return jByteArray2Str(env, jbyteArray1).c_str();
}
+static const int getJByteArraySize(JNIEnv *env, jbyteArray array){
+ if(array == nullptr){
+ return 0;
+ }
+ jsize size = env->GetArrayLength(array);
+ return size;
+}
+
+
static const char *getCharFromJString(JNIEnv *env, jstring string) {
if (string == nullptr)
return "";
@@ -91,7 +100,7 @@ void jsHandleCallNative(JNIEnv *env, jobject object, jstring instanceId, jbyteAr
void
jsHandleCallNativeModule(JNIEnv *env, jobject object, jstring instanceId, jstring module,
jstring method, jbyteArray
- arguments, jbyteArray options) {
+ arguments, jbyteArray options, jboolean from) {
#if JSAPI_LOG
@@ -107,7 +116,9 @@ jsHandleCallNativeModule(JNIEnv *env, jobject object, jstring instanceId, jstrin
getCharFromJString(env, module),
getCharFromJString(env, method),
getCharFromJByte(env, arguments),
- getCharFromJByte(env, options));
+ getJByteArraySize(env, arguments),
+ getCharFromJByte(env, options),
+ getJByteArraySize(env, options));
jfieldID jTypeId = env->GetFieldID(jWXJSObject, "type", "I");
jint jTypeInt = env->GetIntField(result, jTypeId);
@@ -126,31 +137,44 @@ jsHandleCallNativeModule(JNIEnv *env, jobject object, jstring instanceId, jstrin
} else if (jTypeInt == 3) {
jstring jDataStr = (jstring) jDataObj;
//ret = std::move(createJSONStringResult(env, jDataStr));
+ } else if (jTypeInt == 4) {
+ jbyteArray array = (jbyteArray)jDataObj;
+ if(array != nullptr){
+ int length = env->GetArrayLength(array);
+ void* data = env->GetByteArrayElements(array, 0);
+ //ret = std::move(createByteArrayResult((const char*)data, length));
+ env->ReleaseByteArrayElements(array, (jbyte*)data, 0);
+ }
}
env->DeleteLocalRef(jDataObj);
+ if(result != nullptr){
+ env->DeleteLocalRef(result);
+ }
//return ret;
}
void
jsHandleCallNativeComponent(JNIEnv *env, jobject object, jstring instanceId, jstring componentRef,
jstring method,
- jbyteArray arguments, jbyteArray options) {
+ jbyteArray arguments, jbyteArray options, jboolean from) {
Bridge_Impl_Android::getInstance()->callNativeComponent(getCharFromJString(env, instanceId),
getCharFromJString(env, componentRef),
getCharFromJString(env, method),
getCharFromJByte(env, arguments),
- getCharFromJByte(env, options));
+ getJByteArraySize(env, arguments),
+ getCharFromJByte(env, options),
+ getJByteArraySize(env, options));
}
void
-jsHandleCallAddElement(JNIEnv *env, jobject object, jstring instanceId, jstring ref, jstring dom,
+jsHandleCallAddElement(JNIEnv *env, jobject object, jstring instanceId, jstring ref, jbyteArray dom,
jstring index) {
const char *instanceChar = env->GetStringUTFChars(instanceId, 0);
const char *refChar = env->GetStringUTFChars(ref, 0);
- const char *domChar = env->GetStringUTFChars(dom, 0);
+ const char *domChar = getCharFromJByte(env, dom);
const char *indexChar = env->GetStringUTFChars(index, 0);
int indexI = atoi(indexChar);
@@ -173,13 +197,12 @@ void jsHandleCallNativeLog(JNIEnv *env, jobject object, jbyteArray str_array) {
Bridge_Impl_Android::getInstance()->callNativeLog(getCharFromJByte(env, str_array));
}
-void jsFunctionCallCreateBody(JNIEnv *env, jobject object, jstring pageId, jstring domStr) {
-
+void jsFunctionCallCreateBody(JNIEnv *env, jobject object, jstring pageId, jbyteArray domStr, jboolean from) {
if (pageId == nullptr || domStr == nullptr)
return;
const char *page = env->GetStringUTFChars(pageId, NULL);
- const char *dom = env->GetStringUTFChars(domStr, NULL);
+ const char *dom = getCharFromJByte(env, domStr);
if (page == nullptr || dom == nullptr || strlen(dom) == 0)
return;
RenderManager::GetInstance()->CreatePage(page, dom);
@@ -208,17 +231,17 @@ jsFunctionCallRefreshFinish(JNIEnv *env, jobject object, jstring instanceId, jby
}
void
-jsFunctionCallUpdateAttrs(JNIEnv *env, jobject object, jstring pageId, jstring ref, jstring data) {
+jsFunctionCallUpdateAttrs(JNIEnv *env, jobject object, jstring pageId, jstring ref, jbyteArray data, jboolean from) {
RenderManager::GetInstance()->UpdateAttr(env->GetStringUTFChars(pageId, 0),
env->GetStringUTFChars(ref, 0),
- env->GetStringUTFChars(data, 0));
+ getCharFromJByte(env, data));
}
void
-jsFunctionCallUpdateStyle(JNIEnv *env, jobject object, jstring pageId, jstring ref, jstring data) {
+jsFunctionCallUpdateStyle(JNIEnv *env, jobject object, jstring pageId, jstring ref, jbyteArray data, jboolean from) {
RenderManager::GetInstance()->UpdateStyle(env->GetStringUTFChars(pageId, 0),
env->GetStringUTFChars(ref, 0),
- env->GetStringUTFChars(data, 0));
+ getCharFromJByte(env, data));
}
void jsFunctionCallRemoveElement(JNIEnv *env, jobject object, jstring pageId, jstring ref) {
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/50ae70ce/weex_core/Source/android/bridge/impl/native_render_object_utils_impl_android.cpp
----------------------------------------------------------------------
diff --git a/weex_core/Source/android/bridge/impl/native_render_object_utils_impl_android.cpp b/weex_core/Source/android/bridge/impl/native_render_object_utils_impl_android.cpp
index 42b903c..493015b 100644
--- a/weex_core/Source/android/bridge/impl/native_render_object_utils_impl_android.cpp
+++ b/weex_core/Source/android/bridge/impl/native_render_object_utils_impl_android.cpp
@@ -92,6 +92,11 @@ static jlong CopyRenderObject(JNIEnv* env, jclass jcaller, jlong ptr){
}
static void showRenderObjectLayout(RenderObject *renderObject, int level){
+ LOGE("RenderObject layout %s %d %p %f %f %f %f ", renderObject->Type().c_str(),
+ renderObject->getStypePositionType(),
+ renderObject, renderObject->getLayoutHeight(), renderObject->getLayoutWidth(),
+ renderObject->getLayoutPositionLeft(), renderObject->getLayoutPositionRight());
+
for(auto it = renderObject->ChildListIterBegin(); it != renderObject->ChildListIterEnd(); it++){
RenderObject* child = static_cast<RenderObject*>(*it);
showRenderObjectLayout(child, level + 1);
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/50ae70ce/weex_core/Source/android/jniprebuild/jni_files
----------------------------------------------------------------------
diff --git a/weex_core/Source/android/jniprebuild/jni_files b/weex_core/Source/android/jniprebuild/jni_files
index 0fc5493..7b88e9f 100644
--- a/weex_core/Source/android/jniprebuild/jni_files
+++ b/weex_core/Source/android/jniprebuild/jni_files
@@ -1,6 +1,6 @@
+com/taobao/weex/bridge/WXJsFunctions.java
com/taobao/weex/ui/component/list/template/jni/NativeRenderObjectUtils.java
com/taobao/weex/base/SystemMessageHandler.java
com/taobao/weex/bridge/WXBridge.java
com/taobao/weex/layout/MeasureMode.java
-com/taobao/weex/layout/ContentBoxMeasurement.java
-com/taobao/weex/bridge/WXJsFunctions.java
\ No newline at end of file
+com/taobao/weex/layout/ContentBoxMeasurement.java
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/50ae70ce/weex_core/Source/android/jniprebuild/jniheader/WXJsFunctions_jni.h
----------------------------------------------------------------------
diff --git a/weex_core/Source/android/jniprebuild/jniheader/WXJsFunctions_jni.h b/weex_core/Source/android/jniprebuild/jniheader/WXJsFunctions_jni.h
index 1f7d2c0..a6cad5a 100644
--- a/weex_core/Source/android/jniprebuild/jniheader/WXJsFunctions_jni.h
+++ b/weex_core/Source/android/jniprebuild/jniheader/WXJsFunctions_jni.h
@@ -34,22 +34,22 @@ static void jsHandleCallNative(JNIEnv *env, jobject object, jstring instanceId,
static void
jsHandleCallNativeModule(JNIEnv *env, jobject object, jstring instanceId, jstring module,
jstring method, jbyteArray
- arguments, jbyteArray options);
+ arguments, jbyteArray options,jboolean from);
static void
jsHandleCallNativeComponent(JNIEnv *env, jobject object, jstring instanceId, jstring componentRef,
jstring method,
- jbyteArray arguments, jbyteArray options);
+ jbyteArray arguments, jbyteArray options, jboolean from);
static void
-jsHandleCallAddElement(JNIEnv *env, jobject object, jstring instanceId, jstring ref, jstring dom,
+jsHandleCallAddElement(JNIEnv *env, jobject object, jstring instanceId, jstring ref, jbyteArray dom,
jstring index);
static void jsHandleSetTimeout(JNIEnv *env, jobject object, jstring callbackId, jstring time);
static void jsHandleCallNativeLog(JNIEnv *env, jobject object, jbyteArray str_array);
-static void jsFunctionCallCreateBody(JNIEnv *env, jobject object, jstring pageId, jstring domStr);
+static void jsFunctionCallCreateBody(JNIEnv *env, jobject object, jstring pageId, jbyteArray domStr, jboolean from);
static void
jsFunctionCallUpdateFinish(JNIEnv *env, jobject object, jstring instanceId, jbyteArray tasks,
@@ -62,10 +62,10 @@ jsFunctionCallRefreshFinish(JNIEnv *env, jobject object, jstring instanceId, jby
jstring callback);
static void
-jsFunctionCallUpdateAttrs(JNIEnv *env, jobject object, jstring pageId, jstring ref, jstring data);
+jsFunctionCallUpdateAttrs(JNIEnv *env, jobject object, jstring pageId, jstring ref, jbyteArray data, jboolean from);
static void
-jsFunctionCallUpdateStyle(JNIEnv *env, jobject object, jstring pageId, jstring ref, jstring data);
+jsFunctionCallUpdateStyle(JNIEnv *env, jobject object, jstring pageId, jstring ref, jbyteArray data, jboolean from);
static void jsFunctionCallRemoveElement(JNIEnv *env, jobject object, jstring pageId, jstring ref);
@@ -103,13 +103,13 @@ static const JNINativeMethod kMethodsWXJsFunctions[] = {
"(Ljava/lang/String;[BLjava/lang/String;)V",
reinterpret_cast<void *>(jsHandleCallNative)},
{"jsHandleCallNativeModule",
- "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[B[B)V",
+ "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[B[BZ)V",
reinterpret_cast<void *>(jsHandleCallNativeModule)},
{"jsHandleCallNativeComponent",
- "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[B[B)V",
+ "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[B[BZ)V",
reinterpret_cast<void *>(jsHandleCallNativeComponent)},
{"jsHandleCallAddElement",
- "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V",
+ "(Ljava/lang/String;Ljava/lang/String;[BLjava/lang/String;Z)V",
reinterpret_cast<void *>(jsHandleCallAddElement)},
{"jsHandleSetTimeout",
"(Ljava/lang/String;Ljava/lang/String;)V",
@@ -118,7 +118,7 @@ static const JNINativeMethod kMethodsWXJsFunctions[] = {
"([B)V",
reinterpret_cast<void *>(jsHandleCallNativeLog)},
{"jsFunctionCallCreateBody",
- "(Ljava/lang/String;Ljava/lang/String;)V",
+ "(Ljava/lang/String;[BZ)V",
reinterpret_cast<void *>(jsFunctionCallCreateBody)},
{"jsFunctionCallUpdateFinish",
"(Ljava/lang/String;[BLjava/lang/String;)V",
@@ -130,10 +130,10 @@ static const JNINativeMethod kMethodsWXJsFunctions[] = {
"(Ljava/lang/String;[BLjava/lang/String;)V",
reinterpret_cast<void *>(jsFunctionCallRefreshFinish)},
{"jsFunctionCallUpdateAttrs",
- "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V",
+ "(Ljava/lang/String;Ljava/lang/String;[BZ)V",
reinterpret_cast<void *>(jsFunctionCallUpdateAttrs)},
{"jsFunctionCallUpdateStyle",
- "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V",
+ "(Ljava/lang/String;Ljava/lang/String;[BZ)V",
reinterpret_cast<void *>(jsFunctionCallUpdateStyle)},
{"jsFunctionCallRemoveElement",
"(Ljava/lang/String;Ljava/lang/String;)V",