Skip to content
This repository has been archived by the owner on Jun 3, 2021. It is now read-only.

Commit

Permalink
[core][Android] support dispatchMessageSync api (#1743)
Browse files Browse the repository at this point in the history
  • Loading branch information
yxping authored and YorkShen committed Nov 13, 2018
1 parent 235f3a5 commit ded64a3
Show file tree
Hide file tree
Showing 17 changed files with 145 additions and 5 deletions.
Binary file modified android/sdk/libs/armeabi-v7a/libweexcore.so
Binary file not shown.
Binary file modified android/sdk/libs/armeabi-v7a/libweexjss.so
Binary file not shown.
Binary file modified android/sdk/libs/armeabi/libweexcore.so
Binary file not shown.
Binary file modified android/sdk/libs/armeabi/libweexjss.so
Binary file not shown.
6 changes: 6 additions & 0 deletions ios/sdk/WeexSDK/Sources/Bridge/WXCoreBridge.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 {};
};

Expand Down
1 change: 1 addition & 0 deletions weex_core/Source/IPC/IPCMessageJS.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ enum class IPCProxyMsg {
CLEARINTERVAL,
POSTMESSAGE,
DISPATCHMESSAGE,
DISPATCHMESSAGESYNC,
ONRECEIVEDRESULT,
};
// Message from Script to Core in ScriptBridge
Expand Down
17 changes: 17 additions & 0 deletions weex_core/Source/android/bridge/platform/android_side.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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);
Expand Down
4 changes: 4 additions & 0 deletions weex_core/Source/android/bridge/platform/android_side.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
27 changes: 27 additions & 0 deletions weex_core/Source/android/bridge/script_bridge_in_multi_process.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
}
Expand Down
23 changes: 23 additions & 0 deletions weex_core/Source/android/bridge/script_bridge_in_multi_so.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down Expand Up @@ -506,6 +528,7 @@ FunctionsExposedByCore *ScriptBridgeInMultiSo::GetExposedFunctions() {
CallT3DLinkNative,
PostMessage,
DispatchMessage,
DispatchMessageSync,
OnReceivedResult};
auto functions =
(FunctionsExposedByCore *)malloc(sizeof(FunctionsExposedByCore));
Expand Down
32 changes: 32 additions & 0 deletions weex_core/Source/android/wrap/wml_bridge.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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
10 changes: 7 additions & 3 deletions weex_core/Source/android/wrap/wml_bridge.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
8 changes: 6 additions & 2 deletions weex_core/Source/core/bridge/platform_bridge.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
9 changes: 9 additions & 0 deletions weex_core/Source/core/bridge/script/core_side_in_script.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
4 changes: 4 additions & 0 deletions weex_core/Source/core/bridge/script/core_side_in_script.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
3 changes: 3 additions & 0 deletions weex_core/Source/core/bridge/script_bridge.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
6 changes: 6 additions & 0 deletions weex_core/Source/include/WeexApiHeader.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -175,6 +180,7 @@ typedef struct FunctionsExposedByCore {
FuncT3dLinkNative funcT3dLinkNative;
FuncCallHandlePostMessage funcCallHandlePostMessage;
FuncCallDIspatchMessage funcCallDIspatchMessage;
FuncCallDispatchMessageSync funcCallDispatchMessageSync;
FuncOnReceivedResult funcOnReceivedResult;
} FunctionsExposedByCore;

Expand Down

0 comments on commit ded64a3

Please sign in to comment.