This is an automated email from the ASF dual-hosted git repository.

kyork pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-weex.git


The following commit(s) were added to refs/heads/master by this push:
     new ded64a3  [core][Android] support dispatchMessageSync api (#1743)
ded64a3 is described below

commit ded64a3b895c917e487a95cbd4a5847da0c75cc0
Author: yxping <yxp...@users.noreply.github.com>
AuthorDate: Tue Nov 13 12:17:11 2018 +0800

    [core][Android] support dispatchMessageSync api (#1743)
---
 android/sdk/libs/armeabi-v7a/libweexcore.so        | Bin 1214488 -> 1116120 
bytes
 android/sdk/libs/armeabi-v7a/libweexjss.so         | Bin 341484 -> 525844 bytes
 android/sdk/libs/armeabi/libweexcore.so            | Bin 1226776 -> 1128400 
bytes
 android/sdk/libs/armeabi/libweexjss.so             | Bin 341484 -> 525844 bytes
 ios/sdk/WeexSDK/Sources/Bridge/WXCoreBridge.h      |   6 ++++
 weex_core/Source/IPC/IPCMessageJS.h                |   1 +
 .../android/bridge/platform/android_side.cpp       |  17 +++++++++++
 .../Source/android/bridge/platform/android_side.h  |   4 +++
 .../bridge/script_bridge_in_multi_process.cpp      |  27 +++++++++++++++++
 .../android/bridge/script_bridge_in_multi_so.cpp   |  23 +++++++++++++++
 weex_core/Source/android/wrap/wml_bridge.cpp       |  32 +++++++++++++++++++++
 weex_core/Source/android/wrap/wml_bridge.h         |  10 +++++--
 weex_core/Source/core/bridge/platform_bridge.h     |   8 ++++--
 .../core/bridge/script/core_side_in_script.cpp     |   9 ++++++
 .../core/bridge/script/core_side_in_script.h       |   4 +++
 weex_core/Source/core/bridge/script_bridge.h       |   3 ++
 weex_core/Source/include/WeexApiHeader.h           |   6 ++++
 17 files changed, 145 insertions(+), 5 deletions(-)

diff --git a/android/sdk/libs/armeabi-v7a/libweexcore.so 
b/android/sdk/libs/armeabi-v7a/libweexcore.so
index 854d71f..08a3751 100644
Binary files a/android/sdk/libs/armeabi-v7a/libweexcore.so and 
b/android/sdk/libs/armeabi-v7a/libweexcore.so differ
diff --git a/android/sdk/libs/armeabi-v7a/libweexjss.so 
b/android/sdk/libs/armeabi-v7a/libweexjss.so
index a5664ef..6554e1d 100755
Binary files a/android/sdk/libs/armeabi-v7a/libweexjss.so and 
b/android/sdk/libs/armeabi-v7a/libweexjss.so differ
diff --git a/android/sdk/libs/armeabi/libweexcore.so 
b/android/sdk/libs/armeabi/libweexcore.so
index 9f540a7..a88a0ff 100644
Binary files a/android/sdk/libs/armeabi/libweexcore.so and 
b/android/sdk/libs/armeabi/libweexcore.so differ
diff --git a/android/sdk/libs/armeabi/libweexjss.so 
b/android/sdk/libs/armeabi/libweexjss.so
index a5664ef..6554e1d 100755
Binary files a/android/sdk/libs/armeabi/libweexjss.so and 
b/android/sdk/libs/armeabi/libweexjss.so differ
diff --git a/ios/sdk/WeexSDK/Sources/Bridge/WXCoreBridge.h 
b/ios/sdk/WeexSDK/Sources/Bridge/WXCoreBridge.h
index c611eb1..1e05c2c 100644
--- a/ios/sdk/WeexSDK/Sources/Bridge/WXCoreBridge.h
+++ b/ios/sdk/WeexSDK/Sources/Bridge/WXCoreBridge.h
@@ -116,6 +116,12 @@ namespace WeexCore
         void PostMessage(const char* vm_id, const char* data, int dataLength) 
override {};
         void DispatchMessage(const char* client_id,
                              const char* data, int dataLength, const char* 
callback, const char* vm_id) override {};
+        
+        std::unique_ptr<WeexJSResult> DispatchMessageSync(const char* 
client_id, const char* data,
+                                                          int dataLength, 
const char* vm_id) override {
+            return std::unique_ptr<WeexJSResult>();
+        }
+        
         void OnReceivedResult(long callback_id, std::unique_ptr<WeexJSResult>& 
result) override {};
     };
     
diff --git a/weex_core/Source/IPC/IPCMessageJS.h 
b/weex_core/Source/IPC/IPCMessageJS.h
index ec0ecf2..a99b265 100644
--- a/weex_core/Source/IPC/IPCMessageJS.h
+++ b/weex_core/Source/IPC/IPCMessageJS.h
@@ -69,6 +69,7 @@ enum class IPCProxyMsg {
     CLEARINTERVAL,
        POSTMESSAGE,
        DISPATCHMESSAGE,
+       DISPATCHMESSAGESYNC,
        ONRECEIVEDRESULT,
 };
 // Message from Script to Core in ScriptBridge
diff --git a/weex_core/Source/android/bridge/platform/android_side.cpp 
b/weex_core/Source/android/bridge/platform/android_side.cpp
index bce1656..b2809a9 100644
--- a/weex_core/Source/android/bridge/platform/android_side.cpp
+++ b/weex_core/Source/android/bridge/platform/android_side.cpp
@@ -20,6 +20,7 @@
 #include "android/bridge/platform/android_side.h"
 #include "IPC/IPCResult.h"
 #include "android/base/jni/android_jni.h"
+#include "android/base/jni/jbytearray_ref.h"
 #include "android/base/jni_type.h"
 #include "android/base/string/string_utils.h"
 #include "android/utils/IPCStringResult.h"
@@ -363,6 +364,22 @@ void AndroidSide::DispatchMessage(const char *client_id,
   wml_bridge_->DispatchMessage(env, client_id,  data, dataLength, callback, 
vm_id);
 }
 
+std::unique_ptr<WeexJSResult> AndroidSide::DispatchMessageSync(
+    const char *client_id, const char *data, int dataLength,
+    const char *vm_id) {
+  JNIEnv *env = base::android::AttachCurrentThread();
+  auto jni_result =
+      wml_bridge_->DispatchMessageSync(env, client_id, data, dataLength, 
vm_id);
+  JByteArrayRef byte_array(env, jni_result.Get());
+  char *copy = nullptr;
+  if (byte_array.length() > 0) {
+    copy = new char[byte_array.length()];
+    strcpy(copy, byte_array.getBytes());
+  }
+  return std::unique_ptr<WeexJSResult>(
+      new WeexJSResult(std::unique_ptr<char[]>(copy), byte_array.length()));
+}
+
 void AndroidSide::OnReceivedResult(long callback_id, 
std::unique_ptr<WeexJSResult>& result) {
   JNIEnv *env = base::android::AttachCurrentThread();
   wx_bridge_->OnReceivedResult(env, callback_id,  result);
diff --git a/weex_core/Source/android/bridge/platform/android_side.h 
b/weex_core/Source/android/bridge/platform/android_side.h
index 53fc0b2..566bd42 100644
--- a/weex_core/Source/android/bridge/platform/android_side.h
+++ b/weex_core/Source/android/bridge/platform/android_side.h
@@ -109,6 +109,10 @@ class AndroidSide : public PlatformBridge::PlatformSide {
   void PostMessage(const char* vm_id, const char* data, int dataLength) 
override;
   void DispatchMessage(const char* client_id,
                        const char* data, int dataLength, const char* callback, 
const char* vm_id) override;
+  std::unique_ptr<WeexJSResult> DispatchMessageSync(const char* client_id,
+                                                    const char* data,
+                                                    int dataLength,
+                                                    const char* vm_id) 
override;
   void OnReceivedResult(long callback_id, std::unique_ptr<WeexJSResult>& 
result) override;
 
   jobject getMeasureFunc(const char* pageId, jlong renderObjectPtr);
diff --git a/weex_core/Source/android/bridge/script_bridge_in_multi_process.cpp 
b/weex_core/Source/android/bridge/script_bridge_in_multi_process.cpp
index ff9691f..5b10902 100644
--- a/weex_core/Source/android/bridge/script_bridge_in_multi_process.cpp
+++ b/weex_core/Source/android/bridge/script_bridge_in_multi_process.cpp
@@ -904,6 +904,31 @@ std::unique_ptr<IPCResult> 
HandleDispatchMessage(IPCArguments *arguments) {
   return createInt32Result(static_cast<int32_t>(true));
 }
 
+std::unique_ptr<IPCResult> HandleDispatchMessageSync(IPCArguments *arguments) {
+  int i = getArumentAsCStrLen(arguments, 1);
+  weex::base::WaitableEvent event;
+  std::unique_ptr<WeexJSResult> result;
+  WeexCoreManager::Instance()->script_thread()->message_loop()->PostTask(
+      weex::base::MakeCopyable(
+          [clientId = std::unique_ptr<char[]>(getArumentAsCStr(arguments, 0)),
+           dataS = std::unique_ptr<char[]>(getArumentAsCStr(arguments, 1)),
+           vmId = std::unique_ptr<char[]>(getArumentAsCStr(arguments, 2)),
+           length = i, e = &event, r = &result]() {
+            *r = WeexCoreManager::Instance()
+                     ->script_bridge()
+                     ->core_side()
+                     ->DispatchMessageSync(clientId.get(), dataS.get(), length,
+                                           vmId.get());
+            e->Signal();
+          }));
+  event.Wait();
+  if (result->length > 0) {
+    return createByteArrayResult(result->data.get(), result->length);
+  } else {
+    return createVoidResult();
+  }
+}
+
 std::unique_ptr<IPCResult> OnReceivedResult(IPCArguments *arguments) {
   long callback_id = arguments->get<long>(0);
   std::unique_ptr<WeexJSResult> result;
@@ -1018,6 +1043,8 @@ void 
ScriptBridgeInMultiProcess::RegisterIPCCallback(IPCHandler *handler) {
                            HandlePostMessage);
   handler->registerHandler(static_cast<uint32_t>(IPCProxyMsg::DISPATCHMESSAGE),
                            HandleDispatchMessage);
+  
handler->registerHandler(static_cast<uint32_t>(IPCProxyMsg::DISPATCHMESSAGESYNC),
+                           HandleDispatchMessageSync);
   
handler->registerHandler(static_cast<uint32_t>(IPCProxyMsg::ONRECEIVEDRESULT),
                            OnReceivedResult);
 }
diff --git a/weex_core/Source/android/bridge/script_bridge_in_multi_so.cpp 
b/weex_core/Source/android/bridge/script_bridge_in_multi_so.cpp
index 685f69f..400a83f 100644
--- a/weex_core/Source/android/bridge/script_bridge_in_multi_so.cpp
+++ b/weex_core/Source/android/bridge/script_bridge_in_multi_so.cpp
@@ -443,6 +443,28 @@ static void DispatchMessage(const char *client_id, const 
char *data, int dataLen
           }));
 }
 
+static std::unique_ptr<WeexJSResult> DispatchMessageSync(const char *client_id,
+                                                         const char *data,
+                                                         int dataLength,
+                                                         const char *vm_id) {
+  weex::base::WaitableEvent event;
+  std::unique_ptr<WeexJSResult> result;
+  WeexCoreManager::Instance()->script_thread()->message_loop()->PostTask(
+      weex::base::MakeCopyable([client_id = std::string(client_id),
+                                data = std::string(data),
+                                vm_id = std::string(vm_id), length = 
dataLength,
+                                e = &event, r = &result]() {
+        *r = WeexCoreManager::Instance()
+                 ->script_bridge()
+                 ->core_side()
+                 ->DispatchMessageSync(client_id.c_str(), data.c_str(), length,
+                                       vm_id.c_str());
+        e->Signal();
+      }));
+  event.Wait();
+  return result;
+}
+
 static void OnReceivedResult(long callback_id,
                              std::unique_ptr<WeexJSResult> &result) {
   WeexCoreManager::Instance()->script_thread()->message_loop()->PostTask(
@@ -506,6 +528,7 @@ FunctionsExposedByCore 
*ScriptBridgeInMultiSo::GetExposedFunctions() {
                                  CallT3DLinkNative,
                                  PostMessage,
                                  DispatchMessage,
+                                 DispatchMessageSync,
                                  OnReceivedResult};
   auto functions =
       (FunctionsExposedByCore *)malloc(sizeof(FunctionsExposedByCore));
diff --git a/weex_core/Source/android/wrap/wml_bridge.cpp 
b/weex_core/Source/android/wrap/wml_bridge.cpp
index c683c03..35f2cab 100644
--- a/weex_core/Source/android/wrap/wml_bridge.cpp
+++ b/weex_core/Source/android/wrap/wml_bridge.cpp
@@ -235,6 +235,21 @@ static void Java_WMLBridge_dispatchMessage(JNIEnv* env, 
jobject obj,
   base::android::CheckException(env);
 }
 
+static intptr_t g_WMLBridge_dispatchMessageSync = 0;
+static base::android::ScopedLocalJavaRef<jbyteArray>
+Java_WMLBridge_dispatchMessageSync(JNIEnv* env, jobject obj, jstring clientID,
+                                   jstring vmID, jbyteArray data) {
+  jmethodID method_id = base::android::GetMethod(
+      env, g_WMLBridge_clazz, base::android::INSTANCE_METHOD,
+      "dispatchMessageSync", "(Ljava/lang/String;Ljava/lang/String;[B)[B",
+      &g_WMLBridge_dispatchMessageSync);
+
+  auto result = env->CallObjectMethod(obj, method_id, clientID, vmID, data);
+  base::android::CheckException(env);
+  return base::android::ScopedLocalJavaRef<jbyteArray>(
+      env, static_cast<jbyteArray>(result));
+}
+
 static intptr_t g_WMLBridge_postMessage = 0;
 
 static void Java_WMLBridge_postMessage(JNIEnv* env, jobject obj, jstring vmID,
@@ -294,4 +309,21 @@ void WMLBridge::DispatchMessage(JNIEnv *env, const char 
*client_id,
   }
 }
 
+base::android::ScopedLocalJavaRef<jbyteArray> WMLBridge::DispatchMessageSync(
+    JNIEnv* env, const char* client_id, const char* data, int dataLength,
+    const char* vm_id) {
+  if (jni_object() != NULL) {
+    auto jni_client_id = base::android::ScopedLocalJavaRef<jstring>(
+        env, newJString(env, client_id));
+    auto jni_array = base::android::ScopedLocalJavaRef<jbyteArray>(
+        env, newJByteArray(env, data, dataLength));
+    auto jni_vm_id =
+        base::android::ScopedLocalJavaRef<jstring>(env, newJString(env, 
vm_id));
+    return Java_WMLBridge_dispatchMessageSync(env, jni_object(),
+                                              jni_client_id.Get(),
+                                              jni_vm_id.Get(), 
jni_array.Get());
+  }
+  return base::android::ScopedLocalJavaRef<jbyteArray>();
+}
+
 }  // namespace WeexCore
\ No newline at end of file
diff --git a/weex_core/Source/android/wrap/wml_bridge.h 
b/weex_core/Source/android/wrap/wml_bridge.h
index ae11e51..10c6a91 100644
--- a/weex_core/Source/android/wrap/wml_bridge.h
+++ b/weex_core/Source/android/wrap/wml_bridge.h
@@ -36,9 +36,13 @@ class WMLBridge : public JNIObjectWrap {
   static bool RegisterJNIUtils(JNIEnv* env);
   WMLBridge() {}
   virtual ~WMLBridge() {}
-  void PostMessage(JNIEnv* env, const char* vm_id, const char* data, int 
dataLength);
-  void DispatchMessage(JNIEnv* env, const char* client_id,
-                       const char* data, int dataLength, const char* callback, 
const char* vm_id);
+  void PostMessage(JNIEnv* env, const char* vm_id, const char* data,
+                   int dataLength);
+  void DispatchMessage(JNIEnv* env, const char* client_id, const char* data,
+                       int dataLength, const char* callback, const char* 
vm_id);
+  base::android::ScopedLocalJavaRef<jbyteArray> DispatchMessageSync(
+      JNIEnv* env, const char* client_id, const char* data, int dataLength,
+      const char* vm_id);
 
  private:
   static WMLBridge* g_instance;
diff --git a/weex_core/Source/core/bridge/platform_bridge.h 
b/weex_core/Source/core/bridge/platform_bridge.h
index 9792258..680563f 100644
--- a/weex_core/Source/core/bridge/platform_bridge.h
+++ b/weex_core/Source/core/bridge/platform_bridge.h
@@ -226,8 +226,12 @@ class PlatformBridge {
         const char* pageId, const char* ref,
         std::vector<std::pair<std::string, std::string>>* style) = 0;
     virtual void PostMessage(const char* vm_id, const char* data, int 
dataLength) = 0;
-    virtual void DispatchMessage(const char* client_id,
-                                 const char* data, int dataLength, const char* 
callback, const char* vm_id) = 0;
+    virtual void DispatchMessage(const char* client_id, const char* data,
+                                 int dataLength, const char* callback,
+                                 const char* vm_id) = 0;
+    virtual std::unique_ptr<WeexJSResult> DispatchMessageSync(
+        const char* client_id, const char* data, int dataLength,
+        const char* vm_id) = 0;
     virtual void OnReceivedResult(long callback_id,
                                   std::unique_ptr<WeexJSResult>& result) = 0;
 
diff --git a/weex_core/Source/core/bridge/script/core_side_in_script.cpp 
b/weex_core/Source/core/bridge/script/core_side_in_script.cpp
index 128b509..d941245 100644
--- a/weex_core/Source/core/bridge/script/core_side_in_script.cpp
+++ b/weex_core/Source/core/bridge/script/core_side_in_script.cpp
@@ -415,6 +415,15 @@ void CoreSideInScript::DispatchMessage(const char 
*client_id, const char *data,
       ->DispatchMessage(client_id, data, dataLength, callback, vm_id);
 }
 
+std::unique_ptr<WeexJSResult> CoreSideInScript::DispatchMessageSync(
+    const char *client_id, const char *data, int dataLength,
+    const char *vm_id) {
+  return WeexCoreManager::Instance()
+      ->getPlatformBridge()
+      ->platform_side()
+      ->DispatchMessageSync(client_id, data, dataLength, vm_id);
+}
+
 void CoreSideInScript::ReportException(const char *page_id, const char *func,
                                        const char *exception_string) {
   //  WeexCoreManager::Instance()->script_thread()->message_loop()->PostTask(
diff --git a/weex_core/Source/core/bridge/script/core_side_in_script.h 
b/weex_core/Source/core/bridge/script/core_side_in_script.h
index 6c872d9..125b1af 100644
--- a/weex_core/Source/core/bridge/script/core_side_in_script.h
+++ b/weex_core/Source/core/bridge/script/core_side_in_script.h
@@ -71,6 +71,10 @@ class CoreSideInScript : public ScriptBridge::CoreSide {
   void PostMessage(const char *vim_id, const char *data, int dataLength) 
override;
   void DispatchMessage(const char *client_id, const char *data, int dataLength,
                        const char *callback, const char *vm_id) override;
+  std::unique_ptr<WeexJSResult> DispatchMessageSync(const char *client_id,
+                                                    const char *data,
+                                                    int dataLength,
+                                                    const char *vm_id) 
override;
   void ReportException(const char *page_id, const char *func,
                        const char *exception_string) override;
   void SetJSVersion(const char *js_version) override;
diff --git a/weex_core/Source/core/bridge/script_bridge.h 
b/weex_core/Source/core/bridge/script_bridge.h
index d7df29b..0c85e0b 100644
--- a/weex_core/Source/core/bridge/script_bridge.h
+++ b/weex_core/Source/core/bridge/script_bridge.h
@@ -76,6 +76,9 @@ class ScriptBridge {
     virtual void PostMessage(const char *vim_id, const char *data, int 
dataLength) = 0;
     virtual void DispatchMessage(const char *client_id, const char *data, int 
dataLength,
                                  const char *callback, const char *vm_id) = 0;
+    virtual std::unique_ptr<WeexJSResult> DispatchMessageSync(
+        const char *client_id, const char *data, int dataLength,
+        const char *vm_id) = 0;
     virtual void ReportException(const char *page_id, const char *func,
                                  const char *exception_string) = 0;
     virtual void SetJSVersion(const char *js_version) = 0;
diff --git a/weex_core/Source/include/WeexApiHeader.h 
b/weex_core/Source/include/WeexApiHeader.h
index 7642bbf..9470cf4 100644
--- a/weex_core/Source/include/WeexApiHeader.h
+++ b/weex_core/Source/include/WeexApiHeader.h
@@ -53,6 +53,8 @@ class WeexJSResult{
 public:
     std::unique_ptr<char[]> data;
     int length = 0;
+    WeexJSResult() : data(nullptr), length(0) {}
+    WeexJSResult(std::unique_ptr<char[]> d, int l) : data(std::move(d)), 
length(l) {}
 };
 
 typedef struct InitFrameworkParams {
@@ -146,6 +148,9 @@ typedef void (*FuncCallHandlePostMessage)(const char 
*vimId, const char *data, i
 typedef void
 (*FuncCallDIspatchMessage)(const char *clientId, const char *data, int 
dataLength, const char *callback, const char *vmId);
 
+typedef std::unique_ptr<WeexJSResult> (*FuncCallDispatchMessageSync)(
+    const char *clientId, const char *data, int dataLength, const char *vmId);
+
 typedef void
 (*FuncOnReceivedResult)(long callback_id, std::unique_ptr<WeexJSResult>& 
result);
 
@@ -175,6 +180,7 @@ typedef struct FunctionsExposedByCore {
     FuncT3dLinkNative funcT3dLinkNative;
     FuncCallHandlePostMessage funcCallHandlePostMessage;
     FuncCallDIspatchMessage funcCallDIspatchMessage;
+    FuncCallDispatchMessageSync funcCallDispatchMessageSync;
     FuncOnReceivedResult  funcOnReceivedResult;
 } FunctionsExposedByCore;
 

Reply via email to