You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@weex.apache.org by GitBox <gi...@apache.org> on 2018/11/13 04:17:13 UTC

[GitHub] YorkShen closed pull request #1743: *[core][Android] support dispatchMessageSync api

YorkShen closed pull request #1743: *[core][Android] support dispatchMessageSync api
URL: https://github.com/apache/incubator-weex/pull/1743
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/android/sdk/libs/armeabi-v7a/libweexcore.so b/android/sdk/libs/armeabi-v7a/libweexcore.so
index 854d71feaf..08a3751a9c 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 a5664ef28a..6554e1dc1d 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 9f540a72ef..a88a0fffb8 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 a5664ef28a..6554e1dc1d 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 c611eb19ea..1e05c2c5bb 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 ec0ecf2683..a99b2656ad 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 bce1656c15..b2809a9743 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 53fc0b2a6f..566bd42b82 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 ff9691fe02..5b10902412 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 685f69f3a6..400a83fe54 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 c683c03dfe..35f2cabeca 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 ae11e51824..10c6a91ce2 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 9792258fe2..680563fde3 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 128b50927d..d9412455c9 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 6c872d9c2b..125b1af86a 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 d7df29bd5f..0c85e0b143 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 7642bbfe84..9470cf4fc0 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;
 


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


With regards,
Apache Git Services