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/06/04 08:10:41 UTC

incubator-weex git commit: * [core] mv ipc to android dir

Repository: incubator-weex
Updated Branches:
  refs/heads/master 78e1000fc -> 19a242971


* [core] mv ipc to android dir


Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/19a24297
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/19a24297
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/19a24297

Branch: refs/heads/master
Commit: 19a242971cac8ec22e14452e149bc44d23e58b3f
Parents: 78e1000
Author: zhongcang <qh...@gmail.com>
Authored: Fri Jun 1 14:15:18 2018 +0800
Committer: YorkShen <sh...@gmail.com>
Committed: Mon Jun 4 16:10:31 2018 +0800

----------------------------------------------------------------------
 weex_core/Source/CMakeLists.txt                 |   6 +-
 .../android/jsengine/api/WeexJSCoreApi.cpp      | 239 +++++++++++++++
 .../Source/android/jsengine/api/WeexJSCoreApi.h |  86 ++++++
 .../jsengine/multiprocess/ExtendJSApi.cpp       |   2 +-
 .../android/jsengine/multiprocess/WeexProxy.cpp |   3 +-
 weex_core/Source/core/api/WeexJSCoreApi.cpp     | 303 -------------------
 weex_core/Source/core/api/WeexJSCoreApi.h       |  86 ------
 weex_core/Source/core/bridge/bridge.h           |   2 +-
 weex_core/Source/core/bridge/js_bridge.cpp      | 201 ++++++++++++
 weex_core/Source/core/bridge/js_bridge.h        |  82 +++++
 .../Source/core/manager/weex_core_manager.cpp   |  11 +-
 .../Source/core/manager/weex_core_manager.h     |  13 +-
 12 files changed, 638 insertions(+), 396 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/19a24297/weex_core/Source/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/weex_core/Source/CMakeLists.txt b/weex_core/Source/CMakeLists.txt
index 4ae9e10..ce49a55 100644
--- a/weex_core/Source/CMakeLists.txt
+++ b/weex_core/Source/CMakeLists.txt
@@ -15,7 +15,6 @@ add_definitions(-DJSAPI_LOG=0)
 add_definitions(-DDOM_PARSER_LOG=0)
 
 set(COMMON_SRCS
-  ./core/api/WeexJSCoreApi.cpp
 
   ./core/render/manager/render_manager.cpp
   ./core/render/page/render_page.cpp
@@ -41,7 +40,9 @@ set(COMMON_SRCS
   ./core/config/core_environment.cpp
 
   ./core/moniter/render_performance.cpp
-  ./core/manager/weex_core_manager.cpp )
+  ./core/manager/weex_core_manager.cpp
+  ./core/bridge/js_bridge.cpp
+        )
 
 SET(FINAL_ADD_LIBRARY
         ${COMMON_SRCS}
@@ -79,6 +80,7 @@ if (ANDROID)
 
 
     ./core/parser/dom_wson.cpp
+    ./android/jsengine/api/WeexJSCoreApi.cpp
      
 
   )

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/19a24297/weex_core/Source/android/jsengine/api/WeexJSCoreApi.cpp
----------------------------------------------------------------------
diff --git a/weex_core/Source/android/jsengine/api/WeexJSCoreApi.cpp b/weex_core/Source/android/jsengine/api/WeexJSCoreApi.cpp
new file mode 100644
index 0000000..6573050
--- /dev/null
+++ b/weex_core/Source/android/jsengine/api/WeexJSCoreApi.cpp
@@ -0,0 +1,239 @@
+/**
+ * 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.
+ */
+//
+// Created by Darin on 13/02/2018.
+//
+
+#include "WeexJSCoreApi.h"
+#include <android/bridge/impl/bridge_impl_android.h>
+#include <android/jsengine/multiprocess/ExtendJSApi.h>
+#include <android/base/string/string_utils.h>
+#include <wson/wson_parser.h>
+#include <core/manager/weex_core_manager.h>
+
+using namespace WeexCore;
+
+extern WeexCore::FunType gCanvasFunc;
+extern WeexCore::FunTypeT3d t3dFunc;
+
+void _setJSVersion(const char *jsVersion) {
+    LOGA("init JSFrm version %s", jsVersion);
+    WeexCoreManager::getInstance()->getJSBridge()->onSetJSVersion(jsVersion);
+}
+
+void _reportException(const char *pageId, const char *func, const char *exception_string) {
+    WeexCoreManager::getInstance()->getJSBridge()->onReportException(
+            pageId,
+            func,
+            exception_string
+    );
+}
+
+void _callNative(const char *pageId, const char *task, const char *callback) {
+    WeexCoreManager::getInstance()->getJSBridge()->onCallNative(
+            pageId,
+            task,
+            callback
+    );
+
+
+};
+
+std::unique_ptr<IPCResult>
+_callNativeModule(const char *pageId, const char *module, const char *method,
+                  const char *arguments, int argumentsLength, const char *options, int optionsLength) {
+    std::unique_ptr<IPCResult> ret = createInt32Result(-1);
+    if (pageId != nullptr && module != nullptr && method != nullptr) {
+#if JSAPI_LOG
+        LOGD("[ExtendJSApi] handleCallNativeModule >>>> pageId: %s, module: %s, method: %s, arg: %s, opt: %s",
+         pageId, module, method, argString, optString);
+#endif
+
+        // add for android support
+        jobject result;
+        result = static_cast<jobject>(
+                WeexCoreManager::getInstance()->getJSBridge()->onCallNativeModule(
+                        pageId, module, method, arguments,
+                        argumentsLength, options,
+                        optionsLength)
+        );
+
+        if (result == nullptr) {
+            return ret;
+        }
+
+        JNIEnv *env = getJNIEnv();
+        jfieldID jTypeId = env->GetFieldID(jWXJSObject, "type", "I");
+        jint jTypeInt = env->GetIntField(result, jTypeId);
+        jfieldID jDataId = env->GetFieldID(jWXJSObject, "data", "Ljava/lang/Object;");
+        jobject jDataObj = env->GetObjectField(result, jDataId);
+        if (jTypeInt == 1) {
+            if (jDoubleValueMethodId == NULL) {
+                jclass jDoubleClazz = env->FindClass("java/lang/Double");
+                jDoubleValueMethodId = env->GetMethodID(jDoubleClazz, "doubleValue", "()D");
+                env->DeleteLocalRef(jDoubleClazz);
+            }
+            jdouble jDoubleObj = env->CallDoubleMethod(jDataObj, jDoubleValueMethodId);
+            ret = std::move(createDoubleResult(jDoubleObj));
+
+        } else if (jTypeInt == 2) {
+            jstring jDataStr = (jstring) jDataObj;
+            ret = std::move(createStringResult(env, jDataStr));
+        } 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 _callNativeComponent(const char *pageId, const char *ref, const char *method,
+                          const char *arguments, int argumentsLength, const char *options, int optionsLength) {
+  WeexCoreManager::getInstance()->getJSBridge()->onCallNativeComponent(
+          pageId, ref, method, arguments, argumentsLength, options, optionsLength
+  );
+}
+
+void _callAddElement(const char *pageId, const char *parentRef, const char *domStr,
+                     const char *index_cstr) {
+
+  WeexCoreManager::getInstance()->getJSBridge()->onCallAddElement(pageId,parentRef,domStr,index_cstr);
+}
+
+void _setTimeout(const char *callbackId, const char *time) {
+    WeexCoreManager::getInstance()->getJSBridge()->onSetTimeout(callbackId,time);
+}
+
+void _callNativeLog(const char *str_array) {
+    WeexCoreManager::getInstance()->getJSBridge()->onCallNativeLog(str_array);
+}
+
+void _callCreateBody(const char *pageId, const char *domStr) {
+    WeexCoreManager::getInstance()->getJSBridge()->onCallCreateBody(pageId,domStr);
+}
+
+int _callUpdateFinish(const char *pageId, const char *task, const char *callback) {
+    return  WeexCoreManager::getInstance()->getJSBridge()->onCallUpdateFinish(pageId,task,callback);
+}
+
+void _callCreateFinish(const char *pageId) {
+    WeexCoreManager::getInstance()->getJSBridge()->onCallCreateFinish(pageId);
+}
+
+int _callRefreshFinish(const char *pageId, const char *task, const char *callback) {
+    return WeexCoreManager::getInstance()->getJSBridge()->onCallRefreshFinish(
+            pageId,task,callback);
+}
+
+void _callUpdateAttrs(const char *pageId, const char *ref, const char *data) {
+    WeexCoreManager::getInstance()->getJSBridge()->onCallUpdateAttrs(pageId,ref,data);
+}
+
+void _callUpdateStyle(const char *pageId, const char *ref, const char *data) {
+    WeexCoreManager::getInstance()->getJSBridge()->onCallUpdateStyle(
+            pageId, ref, data
+    );
+}
+
+void _callRemoveElement(const char *pageId, const char *ref) {
+    WeexCoreManager::getInstance()->getJSBridge()->onCallRemoveElement(pageId,ref);
+}
+
+void _callMoveElement(const char *pageId, const char *ref, const char *parentRef, int index) {
+    WeexCoreManager::getInstance()->getJSBridge()->onCallMoveElement(
+            pageId,ref,parentRef,index
+    );
+}
+
+void _callAddEvent(const char *pageId, const char *ref, const char *event) {
+    WeexCoreManager::getInstance()->getJSBridge()->onCallAddEvent(
+            pageId,ref,event
+    );
+}
+
+void _callRemoveEvent(const char *pageId, const char *ref, const char *event) {
+    WeexCoreManager::getInstance()->getJSBridge()->onCallRemoveEvent(
+            pageId,ref,event
+    );
+}
+
+int _setInterval(const char *pageId, const char *callbackId, const char *_time) {
+    return WeexCoreManager::getInstance()->getJSBridge()->onSetInterval(pageId,callbackId,_time);
+}
+
+void _clearInterval(const char *pageId, const char *callbackId) {
+    WeexCoreManager::getInstance()->getJSBridge()->onClearInterval(pageId,callbackId);
+}
+
+const char *_callGCanvasLinkNative(const char *pageId, int type, const char *args) {
+    const char *retVal = NULL;
+    if (gCanvasFunc) {
+        retVal = callGCanvasFun(gCanvasFunc, pageId, type, args);
+    }
+
+    return retVal;
+}
+
+const char *_t3dLinkNative(int type, const char *args) {
+    const char *retVal = NULL;
+    if (t3dFunc) {
+        retVal = WeexCore::weexCallT3dFunc(t3dFunc, type, args);
+    }
+
+    return retVal;
+}
+
+void callHandlePostMessage(const char *vimId, const char *data) {
+    JNIEnv *pEnv = getJNIEnv();
+    jstring pJstring = pEnv->NewStringUTF(vimId);
+    jbyteArray pArray = newJByteArray(pEnv, data);
+    Bridge_Impl_Android::getInstance()->handlePostMessage(pJstring, pArray);
+    pEnv->DeleteLocalRef(pJstring);
+    pEnv->DeleteLocalRef(pArray);
+}
+
+void
+callDIspatchMessage(const char *clientId, const char *data, const char *callback,
+                    const char *vmId) {
+    JNIEnv *pEnv = getJNIEnv();
+    jstring pClientId = newJString(pEnv, clientId);
+    jbyteArray pArray = newJByteArray(pEnv, data);
+    jstring pCallback = newJString(pEnv, callback);
+    jstring pVmId = newJString(pEnv, vmId);
+    Bridge_Impl_Android::getInstance()->handleDispatchMessage(pClientId, pVmId, pArray, pCallback);
+    pEnv->DeleteLocalRef(pClientId);
+    pEnv->DeleteLocalRef(pArray);
+    pEnv->DeleteLocalRef(pCallback);
+    pEnv->DeleteLocalRef(pVmId);
+}
+
+

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/19a24297/weex_core/Source/android/jsengine/api/WeexJSCoreApi.h
----------------------------------------------------------------------
diff --git a/weex_core/Source/android/jsengine/api/WeexJSCoreApi.h b/weex_core/Source/android/jsengine/api/WeexJSCoreApi.h
new file mode 100644
index 0000000..cf0b81e
--- /dev/null
+++ b/weex_core/Source/android/jsengine/api/WeexJSCoreApi.h
@@ -0,0 +1,86 @@
+/**
+ * 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.
+ */
+//
+// Created by Darin on 13/02/2018.
+//
+
+#ifndef WEEXV8_WEEXJSCOREAPI_H
+#define WEEXV8_WEEXJSCOREAPI_H
+
+#include "jni.h"
+#include "IPCResult.h"
+#include "WeexJSCoreApi.h"
+
+extern "C" {
+
+void _setJSVersion(const char *jsVersion);
+
+void _reportException(const char *pageId, const char *func, const char *exception_string);
+
+void _callNative(const char *pageId, const char *task, const char *callback);
+
+
+std::unique_ptr<IPCResult> _callNativeModule(const char *pageId, const char *module, const char *method,
+                       const char *arguments, int argumentsLength, const char *options, int optionsLength);
+
+void _callNativeComponent(const char *pageId, const char *ref,
+                          const char *method,
+                          const char *arguments, int argumentsLength, const char *options, int optionsLength);
+
+void _callAddElement(const char *pageId, const char *parentRef, const char *domStr,
+                     const char *index_cstr);
+
+void _setTimeout(const char *callbackId, const char *time);
+
+void _callNativeLog(const char *str_array);
+
+void _callCreateBody(const char *pageId, const char *domStr);
+
+int _callUpdateFinish(const char *pageId, const char *task, const char *callback);
+
+void _callCreateFinish(const char *pageId);
+
+int _callRefreshFinish(const char *pageId, const char *task, const char *callback);
+
+void _callUpdateAttrs(const char *pageId, const char *ref, const char *data);
+
+void _callUpdateStyle(const char *pageId, const char *ref, const char *data);
+
+void _callRemoveElement(const char *pageId, const char *ref);
+
+void _callMoveElement(const char *pageId, const char *ref, const char *parentRef, int index);
+
+void _callAddEvent(const char *pageId, const char *ref, const char *event);
+
+void _callRemoveEvent(const char *pageId, const char *ref, const char *event);
+
+int _setInterval(const char *pageId, const char *callbackId, const char *_time);
+
+void _clearInterval(const char *pageId, const char *callbackId);
+
+const char *_callGCanvasLinkNative(const char *pageId, int type, const char *args);
+
+const char *_t3dLinkNative(int type, const char *args);
+
+void callHandlePostMessage(const char *vimId, const char *data);
+
+void
+callDIspatchMessage(const char *clientId, const char *data, const char *callback, const char *vmId);
+};
+#endif //WEEXV8_WEEXJSCOREAPI_H

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/19a24297/weex_core/Source/android/jsengine/multiprocess/ExtendJSApi.cpp
----------------------------------------------------------------------
diff --git a/weex_core/Source/android/jsengine/multiprocess/ExtendJSApi.cpp b/weex_core/Source/android/jsengine/multiprocess/ExtendJSApi.cpp
index 36eeabd..80b60d5 100644
--- a/weex_core/Source/android/jsengine/multiprocess/ExtendJSApi.cpp
+++ b/weex_core/Source/android/jsengine/multiprocess/ExtendJSApi.cpp
@@ -18,7 +18,7 @@
  */
 #include <android/base/string/string_utils.h>
 #include <base/ViewUtils.h>
-#include <core/api/WeexJSCoreApi.h>
+#include <android/jsengine/api/WeexJSCoreApi.h>
 #include "ExtendJSApi.h"
 
 using namespace WeexCore;

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/19a24297/weex_core/Source/android/jsengine/multiprocess/WeexProxy.cpp
----------------------------------------------------------------------
diff --git a/weex_core/Source/android/jsengine/multiprocess/WeexProxy.cpp b/weex_core/Source/android/jsengine/multiprocess/WeexProxy.cpp
index c9bd3b0..dbb7d58 100644
--- a/weex_core/Source/android/jsengine/multiprocess/WeexProxy.cpp
+++ b/weex_core/Source/android/jsengine/multiprocess/WeexProxy.cpp
@@ -23,7 +23,7 @@
 #include <android/base/string/string_utils.h>
 #include <core/config/core_environment.h>
 #include <android/jsengine/multiprocess/ExtendJSApi.h>
-#include <core/api/WeexJSCoreApi.h>
+#include <android/jsengine/api/WeexJSCoreApi.h>
 
 #include <dlfcn.h>
 #include <errno.h>
@@ -267,6 +267,7 @@ namespace WeexCore {
 
         Bridge_Impl_Android::getInstance()->setGlobalRef(jThis);
         WeexCoreManager::getInstance()->setPlatformBridge(Bridge_Impl_Android::getInstance());
+        WeexCoreManager::getInstance()->setJSBridge(new JSBridge());
         RenderManager::GetInstance()->SetMeasureFunctionAdapter(new MeasureFunctionAdapterImplAndroid());
         std::unique_ptr<IPCSerializer> serializer(createIPCSerializer());
         const std::vector<INIT_FRAMEWORK_PARAMS *> &initFrameworkParams = initFromParam(env,

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/19a24297/weex_core/Source/core/api/WeexJSCoreApi.cpp
----------------------------------------------------------------------
diff --git a/weex_core/Source/core/api/WeexJSCoreApi.cpp b/weex_core/Source/core/api/WeexJSCoreApi.cpp
deleted file mode 100644
index a1bd22c..0000000
--- a/weex_core/Source/core/api/WeexJSCoreApi.cpp
+++ /dev/null
@@ -1,303 +0,0 @@
-/**
- * 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.
- */
-//
-// Created by Darin on 13/02/2018.
-//
-
-#include "WeexJSCoreApi.h"
-#include <android/bridge/impl/bridge_impl_android.h>
-#include <core/render/manager/render_manager.h>
-#include <android/jsengine/multiprocess/ExtendJSApi.h>
-#include <android/base/string/string_utils.h>
-#include <wson/wson_parser.h>
-
-using namespace WeexCore;
-
-extern WeexCore::FunType gCanvasFunc;
-extern WeexCore::FunTypeT3d t3dFunc;
-
-void _setJSVersion(const char *jsVersion) {
-    LOGA("init JSFrm version %s", jsVersion);
-    Bridge_Impl_Android::getInstance()->setJSVersion(jsVersion);
-}
-
-void _reportException(const char *pageId, const char *func, const char *exception_string) {
-    Bridge_Impl_Android::getInstance()->reportException(pageId, func, exception_string);
-}
-
-void _callNative(const char *pageId, const char *task, const char *callback) {
-    if (pageId == nullptr || task == nullptr)
-        return;
-#if JSAPI_LOG
-    LOGD("[ExtendJSApi] handleCallNative >>>> pageId: %s, task: %s", pageId, task);
-#endif
-    if (strcmp(task, "[{\"module\":\"dom\",\"method\":\"createFinish\",\"args\":[]}]") == 0) {
-        RenderManager::GetInstance()->CreateFinish(pageId) ? 0 : -1;
-    } else {
-        Bridge_Impl_Android::getInstance()->callNative(pageId, task, callback);
-    }
-
-};
-
-std::unique_ptr<IPCResult>
-_callNativeModule(const char *pageId, const char *module, const char *method,
-                  const char *arguments, int argumentsLength, const char *options, int optionsLength) {
-    std::unique_ptr<IPCResult> ret = createInt32Result(-1);
-    if (pageId != nullptr && module != nullptr && method != nullptr) {
-#if JSAPI_LOG
-        LOGD("[ExtendJSApi] handleCallNativeModule >>>> pageId: %s, module: %s, method: %s, arg: %s, opt: %s",
-         pageId, module, method, argString, optString);
-#endif
-
-        // add for android support
-        jobject result;
-        result = static_cast<jobject>(Bridge_Impl_Android::getInstance()->callNativeModule(pageId, module, method,
-                                                                                           arguments, argumentsLength, options, optionsLength));
-        if (result == nullptr){
-            return ret;
-        }
-
-        JNIEnv *env = getJNIEnv();
-        jfieldID jTypeId = env->GetFieldID(jWXJSObject, "type", "I");
-        jint jTypeInt = env->GetIntField(result, jTypeId);
-        jfieldID jDataId = env->GetFieldID(jWXJSObject, "data", "Ljava/lang/Object;");
-        jobject jDataObj = env->GetObjectField(result, jDataId);
-        if (jTypeInt == 1) {
-            if (jDoubleValueMethodId == NULL) {
-                jclass jDoubleClazz = env->FindClass("java/lang/Double");
-                jDoubleValueMethodId = env->GetMethodID(jDoubleClazz, "doubleValue", "()D");
-                env->DeleteLocalRef(jDoubleClazz);
-            }
-            jdouble jDoubleObj = env->CallDoubleMethod(jDataObj, jDoubleValueMethodId);
-            ret = std::move(createDoubleResult(jDoubleObj));
-
-        } else if (jTypeInt == 2) {
-            jstring jDataStr = (jstring) jDataObj;
-            ret = std::move(createStringResult(env, jDataStr));
-        } 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 _callNativeComponent(const char *pageId, const char *ref, const char *method,
-                          const char *arguments, int argumentsLength, const char *options, int optionsLength) {
-    if (pageId != nullptr && ref != nullptr && method != nullptr) {
-
-#if JSAPI_LOG
-        LOGD("[ExtendJSApi] handleCallNativeComponent >>>> pageId: %s, ref: %s, method: %s, arg: %s, opt: %s",
-         pageId, ref, method, argString, optString);
-#endif
-
-        Bridge_Impl_Android::getInstance()->callNativeComponent(pageId, ref, method,
-                                                                arguments, argumentsLength, options, optionsLength);
-    }
-}
-
-void _callAddElement(const char *pageId, const char *parentRef, const char *domStr,
-                     const char *index_cstr) {
-
-
-    const char *indexChar = index_cstr == nullptr ? "\0" : index_cstr;
-
-    int index = atoi(indexChar);
-    if (pageId == nullptr || parentRef == nullptr || domStr == nullptr || index < -1)
-        return;
-
-#if JSAPI_LOG
-
-    std::string log = "";
-  log.append("pageId: ").append(pageId).append(", parentRef: ").append(parentRef).append(", domStr: ").append(domStr);
-  int log_index = 0;
-  int maxLength = 800;
-  std::string sub;
-  while (log_index < log.length()) {
-    if (log.length() <= log_index + maxLength) {
-      sub = log.substr(log_index);
-    } else {
-      sub = log.substr(log_index, maxLength);
-    }
-
-
-    if (log_index == 0)
-      LOGD("[ExtendJSApi] functionCallAddElement >>>> %s", sub.c_str());
-    else
-      LOGD("      [ExtendJSApi] functionCallAddElement >>>> %s", sub.c_str());
-
-    log_index += maxLength;
-  }
-#endif
-
-    RenderManager::GetInstance()->AddRenderObject(pageId, parentRef, index, domStr);
-}
-
-void _setTimeout(const char *callbackId, const char *time) {
-    Bridge_Impl_Android::getInstance()->setTimeout(callbackId, time);
-}
-
-void _callNativeLog(const char *str_array) {
-    Bridge_Impl_Android::getInstance()->callNativeLog(str_array);
-}
-
-void _callCreateBody(const char *pageId, const char *domStr) {
-#if JSAPI_LOG
-    LOGD("[ExtendJSApi] functionCallCreateBody >>>> pageId: %s, domStr: %s", pageId, domStr);
-#endif
-
-    RenderManager::GetInstance()->CreatePage(pageId, domStr) ? 0 : -1;
-}
-
-int _callUpdateFinish(const char *pageId, const char *task, const char *callback) {
-    return Bridge_Impl_Android::getInstance()->callUpdateFinish(pageId, task, callback);
-}
-
-void _callCreateFinish(const char *pageId) {
-#if JSAPI_LOG
-    LOGD("[ExtendJSApi] functionCallCreateFinish >>>> pageId: %s", pageId);
-#endif
-
-    RenderManager::GetInstance()->CreateFinish(pageId);
-}
-
-int _callRefreshFinish(const char *pageId, const char *task, const char *callback) {
-    if (pageId == nullptr)
-        return -1;
-    return Bridge_Impl_Android::getInstance()->callRefreshFinish(pageId, task, callback);
-}
-
-void _callUpdateAttrs(const char *pageId, const char *ref, const char *data) {
-#if JSAPI_LOG
-    LOGD("[ExtendJSApi] functionCallUpdateAttrs >>>> pageId: %s, ref: %s, data: %s", pageId,
-       ref, data);
-#endif
-
-    RenderManager::GetInstance()->UpdateAttr(pageId, ref, data);
-}
-
-void _callUpdateStyle(const char *pageId, const char *ref, const char *data) {
-#if JSAPI_LOG
-    LOGD("[ExtendJSApi] functionCallUpdateStyle >>>> pageId: %s, ref: %s, data: %s", pageId,
-       ref, data);
-#endif
-
-    RenderManager::GetInstance()->UpdateStyle(pageId, ref, data);
-}
-
-void _callRemoveElement(const char *pageId, const char *ref) {
-#if JSAPI_LOG
-    LOGD("[ExtendJSApi] functionCallRemoveElement >>>> pageId: %s, ref: %s", pageId,
-       ref);
-#endif
-
-    RenderManager::GetInstance()->RemoveRenderObject(pageId, ref);
-}
-
-void _callMoveElement(const char *pageId, const char *ref, const char *parentRef, int index) {
-#if JSAPI_LOG
-    LOGD("[ExtendJSApi] functionCallRemoveElement >>>> pageId: %s, ref: %s, parentRef: %s, index: %d",
-       pageId, ref, parentRef, index);
-#endif
-
-    RenderManager::GetInstance()->MoveRenderObject(pageId, ref, parentRef, index);
-}
-
-void _callAddEvent(const char *pageId, const char *ref, const char *event) {
-#if JSAPI_LOG
-    LOGD("[ExtendJSApi] functionCallAddEvent >>>> pageId: %s, ref: %s, event: %s", pageId,
-       ref, event);
-#endif
-
-    RenderManager::GetInstance()->AddEvent(pageId, ref, event);
-}
-
-void _callRemoveEvent(const char *pageId, const char *ref, const char *event) {
-#if JSAPI_LOG
-    LOGD("[ExtendJSApi] functionCallRemoveEvent >>>> pageId: %s, ref: %s, event: %s", pageId,
-       ref, event);
-#endif
-
-    RenderManager::GetInstance()->RemoveEvent(pageId, ref, event);
-}
-
-int _setInterval(const char *pageId, const char *callbackId, const char *_time) {
-    return (atoi(pageId) << 16) | (atoi(callbackId));
-}
-
-void _clearInterval(const char *pageId, const char *callbackId) {
-    return;
-}
-
-const char *_callGCanvasLinkNative(const char *pageId, int type, const char *args) {
-    const char *retVal = NULL;
-    if (gCanvasFunc) {
-        retVal = callGCanvasFun(gCanvasFunc, pageId, type, args);
-    }
-
-    return retVal;
-}
-
-const char *_t3dLinkNative(int type, const char *args) {
-    const char *retVal = NULL;
-    if (t3dFunc) {
-        retVal = WeexCore::weexCallT3dFunc(t3dFunc, type, args);
-    }
-
-    return retVal;
-}
-
-void callHandlePostMessage(const char *vimId, const char *data) {
-    JNIEnv *pEnv = getJNIEnv();
-    jstring pJstring = pEnv->NewStringUTF(vimId);
-    jbyteArray pArray = newJByteArray(pEnv, data);
-    Bridge_Impl_Android::getInstance()->handlePostMessage(pJstring, pArray);
-    pEnv->DeleteLocalRef(pJstring);
-    pEnv->DeleteLocalRef(pArray);
-}
-
-void
-callDIspatchMessage(const char *clientId, const char *data, const char *callback,
-                    const char *vmId) {
-    JNIEnv *pEnv = getJNIEnv();
-    jstring pClientId = newJString(pEnv, clientId);
-    jbyteArray pArray = newJByteArray(pEnv, data);
-    jstring pCallback = newJString(pEnv, callback);
-    jstring pVmId = newJString(pEnv, vmId);
-    Bridge_Impl_Android::getInstance()->handleDispatchMessage(pClientId, pVmId, pArray, pCallback);
-    pEnv->DeleteLocalRef(pClientId);
-    pEnv->DeleteLocalRef(pArray);
-    pEnv->DeleteLocalRef(pCallback);
-    pEnv->DeleteLocalRef(pVmId);
-}
-
-

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/19a24297/weex_core/Source/core/api/WeexJSCoreApi.h
----------------------------------------------------------------------
diff --git a/weex_core/Source/core/api/WeexJSCoreApi.h b/weex_core/Source/core/api/WeexJSCoreApi.h
deleted file mode 100644
index cf0b81e..0000000
--- a/weex_core/Source/core/api/WeexJSCoreApi.h
+++ /dev/null
@@ -1,86 +0,0 @@
-/**
- * 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.
- */
-//
-// Created by Darin on 13/02/2018.
-//
-
-#ifndef WEEXV8_WEEXJSCOREAPI_H
-#define WEEXV8_WEEXJSCOREAPI_H
-
-#include "jni.h"
-#include "IPCResult.h"
-#include "WeexJSCoreApi.h"
-
-extern "C" {
-
-void _setJSVersion(const char *jsVersion);
-
-void _reportException(const char *pageId, const char *func, const char *exception_string);
-
-void _callNative(const char *pageId, const char *task, const char *callback);
-
-
-std::unique_ptr<IPCResult> _callNativeModule(const char *pageId, const char *module, const char *method,
-                       const char *arguments, int argumentsLength, const char *options, int optionsLength);
-
-void _callNativeComponent(const char *pageId, const char *ref,
-                          const char *method,
-                          const char *arguments, int argumentsLength, const char *options, int optionsLength);
-
-void _callAddElement(const char *pageId, const char *parentRef, const char *domStr,
-                     const char *index_cstr);
-
-void _setTimeout(const char *callbackId, const char *time);
-
-void _callNativeLog(const char *str_array);
-
-void _callCreateBody(const char *pageId, const char *domStr);
-
-int _callUpdateFinish(const char *pageId, const char *task, const char *callback);
-
-void _callCreateFinish(const char *pageId);
-
-int _callRefreshFinish(const char *pageId, const char *task, const char *callback);
-
-void _callUpdateAttrs(const char *pageId, const char *ref, const char *data);
-
-void _callUpdateStyle(const char *pageId, const char *ref, const char *data);
-
-void _callRemoveElement(const char *pageId, const char *ref);
-
-void _callMoveElement(const char *pageId, const char *ref, const char *parentRef, int index);
-
-void _callAddEvent(const char *pageId, const char *ref, const char *event);
-
-void _callRemoveEvent(const char *pageId, const char *ref, const char *event);
-
-int _setInterval(const char *pageId, const char *callbackId, const char *_time);
-
-void _clearInterval(const char *pageId, const char *callbackId);
-
-const char *_callGCanvasLinkNative(const char *pageId, int type, const char *args);
-
-const char *_t3dLinkNative(int type, const char *args);
-
-void callHandlePostMessage(const char *vimId, const char *data);
-
-void
-callDIspatchMessage(const char *clientId, const char *data, const char *callback, const char *vmId);
-};
-#endif //WEEXV8_WEEXJSCOREAPI_H

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/19a24297/weex_core/Source/core/bridge/bridge.h
----------------------------------------------------------------------
diff --git a/weex_core/Source/core/bridge/bridge.h b/weex_core/Source/core/bridge/bridge.h
index 823e06c..5660e4c 100644
--- a/weex_core/Source/core/bridge/bridge.h
+++ b/weex_core/Source/core/bridge/bridge.h
@@ -19,7 +19,7 @@
 #ifndef Bridge_h
 #define Bridge_h
 
-#include <jni.h>
+//#include <jni.h>
 #include <string>
 #include <map>
 #include <set>

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/19a24297/weex_core/Source/core/bridge/js_bridge.cpp
----------------------------------------------------------------------
diff --git a/weex_core/Source/core/bridge/js_bridge.cpp b/weex_core/Source/core/bridge/js_bridge.cpp
new file mode 100644
index 0000000..17608d8
--- /dev/null
+++ b/weex_core/Source/core/bridge/js_bridge.cpp
@@ -0,0 +1,201 @@
+/**
+ * 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.
+ */
+
+#include "js_bridge.h"
+#include <core/manager/weex_core_manager.h>
+#include <core/render/manager/render_manager.h>
+
+namespace WeexCore {
+    void JSBridge::onSetJSVersion(const char *jsVersion) {
+        WeexCoreManager::getInstance()->getPlatformBridge()->setJSVersion(jsVersion);
+    }
+
+    void JSBridge::onReportException(const char *pageId, const char *func, const char *exception_string) {
+        WeexCoreManager::getInstance()->getPlatformBridge()->reportException(pageId, func, exception_string);
+    }
+
+    void JSBridge::onCallNative(const char *pageId, const char *task, const char *callback) {
+        if (pageId == nullptr || task == nullptr)
+            return;
+#if JSAPI_LOG
+        LOGD("[ExtendJSApi] handleCallNative >>>> pageId: %s, task: %s", pageId, task);
+#endif
+        if (strcmp(task, "[{\"module\":\"dom\",\"method\":\"createFinish\",\"args\":[]}]") == 0) {
+            RenderManager::GetInstance()->CreateFinish(pageId) ? 0 : -1;
+        } else {
+            WeexCoreManager::getInstance()->getPlatformBridge()->callNative(pageId, task, callback);
+        }
+    }
+
+
+    void *JSBridge::onCallNativeModule(const char *pageId, const char *module, const char *method,
+                                       const char *arguments, int argumentsLength, const char *options,
+                                       int optionsLength) {
+        return WeexCoreManager::getInstance()->getPlatformBridge()->callNativeModule(
+                pageId, module, method, arguments,
+                argumentsLength, options,
+                optionsLength
+        );
+    }
+
+    void JSBridge::onCallNativeComponent(const char *pageId, const char *ref,
+                                         const char *method,
+                                         const char *arguments, int argumentsLength, const char *options,
+                                         int optionsLength) {
+        if (pageId != nullptr && ref != nullptr && method != nullptr) {
+
+#if JSAPI_LOG
+            LOGD("[ExtendJSApi] handleCallNativeComponent >>>> pageId: %s, ref: %s, method: %s, arg: %s, opt: %s",
+         pageId, ref, method, argString, optString);
+#endif
+            WeexCoreManager::getInstance()->getPlatformBridge()->callNativeComponent(
+                    pageId, ref, method, arguments, argumentsLength, options, optionsLength
+            );
+        }
+    }
+
+
+    void JSBridge::onCallAddElement(const char *pageId, const char *parentRef, const char *domStr,
+                                    const char *index_cstr) {
+        const char *indexChar = index_cstr == nullptr ? "\0" : index_cstr;
+
+        int index = atoi(indexChar);
+        if (pageId == nullptr || parentRef == nullptr || domStr == nullptr || index < -1)
+            return;
+
+#if JSAPI_LOG
+
+        std::string log = "";
+  log.append("pageId: ").append(pageId).append(", parentRef: ").append(parentRef).append(", domStr: ").append(domStr);
+  int log_index = 0;
+  int maxLength = 800;
+  std::string sub;
+  while (log_index < log.length()) {
+    if (log.length() <= log_index + maxLength) {
+      sub = log.substr(log_index);
+    } else {
+      sub = log.substr(log_index, maxLength);
+    }
+
+
+    if (log_index == 0)
+      LOGD("[ExtendJSApi] functionCallAddElement >>>> %s", sub.c_str());
+    else
+      LOGD("      [ExtendJSApi] functionCallAddElement >>>> %s", sub.c_str());
+
+    log_index += maxLength;
+  }
+#endif
+
+        RenderManager::GetInstance()->AddRenderObject(pageId, parentRef, index, domStr);
+    }
+
+    void JSBridge::onSetTimeout(const char *callbackId, const char *time) {
+        WeexCoreManager::getInstance()->getPlatformBridge()->setTimeout(callbackId, time);
+    }
+
+    void JSBridge::onCallNativeLog(const char *str_array) {
+        WeexCoreManager::getInstance()->getPlatformBridge()->callNativeLog(str_array);
+    }
+
+
+    void JSBridge::onCallCreateBody(const char *pageId, const char *domStr) {
+#if JSAPI_LOG
+        LOGD("[ExtendJSApi] functionCallCreateBody >>>> pageId: %s, domStr: %s", pageId, domStr);
+#endif
+
+        RenderManager::GetInstance()->CreatePage(pageId, domStr) ? 0 : -1;
+    }
+
+    int JSBridge::onCallUpdateFinish(const char *pageId, const char *task, const char *callback) {
+        WeexCoreManager::getInstance()->getPlatformBridge()->callUpdateFinish(pageId, task, callback);
+    }
+
+    void JSBridge::onCallCreateFinish(const char *pageId) {
+#if JSAPI_LOG
+        LOGD("[ExtendJSApi] functionCallCreateFinish >>>> pageId: %s", pageId);
+#endif
+
+        RenderManager::GetInstance()->CreateFinish(pageId);
+    }
+
+    int JSBridge::onCallRefreshFinish(const char *pageId, const char *task, const char *callback) {
+        if (pageId == nullptr)
+            return -1;
+        return WeexCoreManager::getInstance()->getPlatformBridge()->callRefreshFinish(pageId, task, callback);
+    }
+
+    void JSBridge::onCallUpdateAttrs(const char *pageId, const char *ref, const char *data) {
+#if JSAPI_LOG
+        LOGD("[ExtendJSApi] functionCallUpdateAttrs >>>> pageId: %s, ref: %s, data: %s", pageId,
+       ref, data);
+#endif
+
+        RenderManager::GetInstance()->UpdateAttr(pageId, ref, data);
+    }
+
+    void JSBridge::onCallUpdateStyle(const char *pageId, const char *ref, const char *data) {
+#if JSAPI_LOG
+        LOGD("[ExtendJSApi] functionCallUpdateStyle >>>> pageId: %s, ref: %s, data: %s", pageId,
+       ref, data);
+#endif
+        RenderManager::GetInstance()->UpdateStyle(pageId, ref, data);
+    }
+
+
+    void JSBridge::onCallRemoveElement(const char *pageId, const char *ref) {
+#if JSAPI_LOG
+        LOGD("[ExtendJSApi] functionCallRemoveElement >>>> pageId: %s, ref: %s", pageId,
+       ref);
+#endif
+        RenderManager::GetInstance()->RemoveRenderObject(pageId, ref);
+    }
+
+    void JSBridge::onCallMoveElement(const char *pageId, const char *ref, const char *parentRef, int index) {
+#if JSAPI_LOG
+        LOGD("[ExtendJSApi] functionCallRemoveElement >>>> pageId: %s, ref: %s, parentRef: %s, index: %d",
+       pageId, ref, parentRef, index);
+#endif
+        RenderManager::GetInstance()->MoveRenderObject(pageId, ref, parentRef, index);
+    }
+
+    void JSBridge::onCallAddEvent(const char *pageId, const char *ref, const char *event) {
+#if JSAPI_LOG
+        LOGD("[ExtendJSApi] functionCallAddEvent >>>> pageId: %s, ref: %s, event: %s", pageId,
+       ref, event);
+#endif
+        RenderManager::GetInstance()->AddEvent(pageId, ref, event);
+    }
+
+    void JSBridge::onCallRemoveEvent(const char *pageId, const char *ref, const char *event) {
+#if JSAPI_LOG
+        LOGD("[ExtendJSApi] functionCallRemoveEvent >>>> pageId: %s, ref: %s, event: %s", pageId,
+       ref, event);
+#endif
+        RenderManager::GetInstance()->RemoveEvent(pageId, ref, event);
+    }
+
+    int JSBridge::onSetInterval(const char *pageId, const char *callbackId, const char *_time) {
+        return (atoi(pageId) << 16) | (atoi(callbackId));
+    }
+
+    void JSBridge::onClearInterval(const char *pageId, const char *callbackId) {
+        return;
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/19a24297/weex_core/Source/core/bridge/js_bridge.h
----------------------------------------------------------------------
diff --git a/weex_core/Source/core/bridge/js_bridge.h b/weex_core/Source/core/bridge/js_bridge.h
new file mode 100644
index 0000000..ee9a771
--- /dev/null
+++ b/weex_core/Source/core/bridge/js_bridge.h
@@ -0,0 +1,82 @@
+/**
+ * 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.
+ */
+//
+// Created by 陈佩翰 on 2018/6/1.
+//
+
+#ifndef WEEXCORE_JS_BRIDGE_H
+#define WEEXCORE_JS_BRIDGE_H
+
+namespace WeexCore {
+    class JSBridge {
+    public:
+        JSBridge(){};
+
+        ~JSBridge(){};
+
+    public:
+
+        void onSetJSVersion(const char *jsVersion);
+
+        void onReportException(const char *pageId, const char *func, const char *exception_string);
+
+        void onCallNative(const char *pageId, const char *task, const char *callback);
+
+
+        void *onCallNativeModule(const char *pageId, const char *module, const char *method,
+                                 const char *arguments, int argumentsLength, const char *options, int optionsLength);
+
+        void onCallNativeComponent(const char *pageId, const char *ref,
+                                   const char *method,
+                                   const char *arguments, int argumentsLength, const char *options, int optionsLength);
+
+        void onCallAddElement(const char *pageId, const char *parentRef, const char *domStr,
+                              const char *index_cstr);
+
+        void onSetTimeout(const char *callbackId, const char *time);
+
+        void onCallNativeLog(const char *str_array);
+
+        void onCallCreateBody(const char *pageId, const char *domStr);
+
+        int onCallUpdateFinish(const char *pageId, const char *task, const char *callback);
+
+        void onCallCreateFinish(const char *pageId);
+
+        int onCallRefreshFinish(const char *pageId, const char *task, const char *callback);
+
+        void onCallUpdateAttrs(const char *pageId, const char *ref, const char *data);
+
+        void onCallUpdateStyle(const char *pageId, const char *ref, const char *data);
+
+        void onCallRemoveElement(const char *pageId, const char *ref);
+
+        void onCallMoveElement(const char *pageId, const char *ref, const char *parentRef, int index);
+
+        void onCallAddEvent(const char *pageId, const char *ref, const char *event);
+
+        void onCallRemoveEvent(const char *pageId, const char *ref, const char *event);
+
+        int onSetInterval(const char *pageId, const char *callbackId, const char *_time);
+
+        void onClearInterval(const char *pageId, const char *callbackId);
+    };
+}
+
+#endif //WEEXCORE_JS_BRIDGE_H
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/19a24297/weex_core/Source/core/manager/weex_core_manager.cpp
----------------------------------------------------------------------
diff --git a/weex_core/Source/core/manager/weex_core_manager.cpp b/weex_core/Source/core/manager/weex_core_manager.cpp
index 067c399..2b49367 100644
--- a/weex_core/Source/core/manager/weex_core_manager.cpp
+++ b/weex_core/Source/core/manager/weex_core_manager.cpp
@@ -30,7 +30,16 @@ namespace WeexCore {
         this->platformBridge = pBridge;
     }
 
-    Bridge *WeexCoreManager::getPlatformBridge() {
+    Bridge* WeexCoreManager::getPlatformBridge() {
         return this->platformBridge;
     }
+
+    WeexCoreManager *WeexCoreManager::setJSBridge(JSBridge *jsBridge) {
+        this->jsBridge = jsBridge;
+    }
+
+    JSBridge* WeexCoreManager::getJSBridge() {
+        return this->jsBridge;
+    }
+
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/19a24297/weex_core/Source/core/manager/weex_core_manager.h
----------------------------------------------------------------------
diff --git a/weex_core/Source/core/manager/weex_core_manager.h b/weex_core/Source/core/manager/weex_core_manager.h
index 0757ba8..3d1fd6d 100644
--- a/weex_core/Source/core/manager/weex_core_manager.h
+++ b/weex_core/Source/core/manager/weex_core_manager.h
@@ -21,17 +21,24 @@
 #define WEEXCORE_WEEX_CORE_MANAGER_H
 
 #include <core/bridge/bridge.h>
+#include <core/bridge/js_bridge.h>
 
 namespace WeexCore {
     class WeexCoreManager {
     private:
         Bridge *platformBridge = nullptr;
         static WeexCoreManager *m_pInstance;
+        JSBridge* jsBridge = nullptr;
 
     private:
         WeexCoreManager() {};
 
-        ~WeexCoreManager() {};
+        ~WeexCoreManager() {
+            delete platformBridge;
+            platformBridge = nullptr;
+            delete jsBridge;
+            jsBridge = nullptr;
+        };
 
         //just to release singleton object
         class Garbo {
@@ -56,6 +63,10 @@ namespace WeexCore {
         Bridge *getPlatformBridge();
 
         WeexCoreManager *setPlatformBridge(Bridge *pBridge);
+
+        JSBridge* getJSBridge();
+        WeexCoreManager *setJSBridge(JSBridge *jsBridge);
+
     };
 }