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;