Repository: incubator-weex Updated Branches: refs/heads/master c4a204e63 -> 547da26af
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/547da26a/weex_core/Source/android/jsengine/multiprocess/WeexProxy.h ---------------------------------------------------------------------- diff --git a/weex_core/Source/android/jsengine/multiprocess/WeexProxy.h b/weex_core/Source/android/jsengine/multiprocess/WeexProxy.h index 6d9a5de..8c11bde 100644 --- a/weex_core/Source/android/jsengine/multiprocess/WeexProxy.h +++ b/weex_core/Source/android/jsengine/multiprocess/WeexProxy.h @@ -35,6 +35,7 @@ #include <IPC/IPCSender.h> #include <IPC/IPCString.h> #include <IPC/Serializing/IPCSerializer.h> +#include "core/../include/WeexApiHeader.h" namespace WeexCore { @@ -48,9 +49,13 @@ public: static jint doInitFramework(JNIEnv *env, jobject object, jstring script, jobject params); - static void + static std::vector<INIT_FRAMEWORK_PARAMS *> initFromParam(JNIEnv *env, jstring script, jobject params, IPCSerializer *serializer); + static jint + initFrameworkInSingleProcess(JNIEnv *env, jstring script, std::vector<INIT_FRAMEWORK_PARAMS *> initFrameworkParams); + static jint initFrameworkInMultiProcess(JNIEnv *env, jstring script, IPCSerializer *serializer); + static const char *getCacheDir(JNIEnv *env); static void setCacheDir(JNIEnv *env); @@ -65,7 +70,7 @@ public: reportException(const char *instanceID, const char *func, const char *exception_string); static void reportServerCrash(jstring jinstanceid); - + static void reportNativeInitStatus(const char *statusCode, const char *errorMsg); static jbyteArray execJSWithResult(JNIEnv* env, jobject jthis, jstring jinstanceid, jstring jnamespace, http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/547da26a/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 new file mode 100644 index 0000000..3ff7532 --- /dev/null +++ b/weex_core/Source/core/api/WeexJSCoreApi.cpp @@ -0,0 +1,292 @@ +/** + * 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> + +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 *argString, const char *optString) { + 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 = Bridge_Impl_Android::getInstance()->callNativeModule(pageId, module, method, + argString, optString); + + 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)); + } + env->DeleteLocalRef(jDataObj); + } + + return ret; +} + +void _callNativeComponent(const char *pageId, const char *ref, + const char *method, const char *argString, + const char *optString) { + 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, argString, + optString); + } +} + +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/547da26a/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 new file mode 100644 index 0000000..8ef33cc --- /dev/null +++ b/weex_core/Source/core/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 *argString, const char *optString); + +void _callNativeComponent(const char *pageId, const char *ref, + const char *method, const char *argString, + const char *optString); + +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/547da26a/weex_core/Source/include/WeexApiHeader.h ---------------------------------------------------------------------- diff --git a/weex_core/Source/include/WeexApiHeader.h b/weex_core/Source/include/WeexApiHeader.h new file mode 100644 index 0000000..dfb40ec --- /dev/null +++ b/weex_core/Source/include/WeexApiHeader.h @@ -0,0 +1,214 @@ +/** + * 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 12/02/2018. +// + +#ifndef WEEXV8_WEEXAPIHEADER_H +#define WEEXV8_WEEXAPIHEADER_H + +#include <jni.h> +#include <vector> +#include <IPC/IPCResult.h> + +struct WeexString { + uint32_t length; + uint16_t content[1]; +}; + +struct WeexByteArray { + uint32_t length; + char content[1]; +}; + +typedef void (*FuncSetJSVersion)(const char *jsVersion); + +typedef void (*FuncReportException)(const char *pageId, const char *func, + const char *exception_string); + +typedef void (*FuncCallNative)(const char *pageId, const char *task, const char *callback); + +typedef std::unique_ptr<IPCResult> (*FuncCallNativeModule)(const char *pageId, const char *module, + const char *method, + const char *argString, + const char *optString); + +typedef void (*FuncCallNativeComponent)(const char *pageId, const char *ref, + const char *method, const char *argString, + const char *optString); + +typedef void (*FuncCallAddElement)(const char *pageId, const char *parentRef, const char *domStr, + const char *index_cstr); + +typedef void (*FuncSetTimeout)(const char *callbackId, const char *time); + +typedef void (*FuncCallNativeLog)(const char *str_array); + +typedef void (*FuncCallCreateBody)(const char *pageId, const char *domStr); + +typedef int (*FuncCallUpdateFinish)(const char *pageId, const char *task, const char *callback); + +typedef void (*FuncCallCreateFinish)(const char *pageId); + +typedef int (*FuncCallRefreshFinish)(const char *pageId, const char *task, const char *callback); + +typedef void (*FuncCallUpdateAttrs)(const char *pageId, const char *ref, const char *data); + +typedef void (*FuncCallUpdateStyle)(const char *pageId, const char *ref, const char *data); + +typedef void (*FuncCallRemoveElement)(const char *pageId, const char *ref); + +typedef void (*FuncCallMoveElement)(const char *pageId, const char *ref, const char *parentRef, + int index); + +typedef void (*FuncCallAddEvent)(const char *pageId, const char *ref, const char *event); + +typedef void (*FuncCallRemoveEvent)(const char *pageId, const char *ref, const char *event); + +typedef int (*FuncSetInterval)(const char *pageId, const char *callbackId, const char *_time); + +typedef void (*FuncClearInterval)(const char *pageId, const char *callbackId); + +typedef const char *(*FuncCallGCanvasLinkNative)(const char *pageId, int type, const char *args); + +typedef const char *(*FuncT3dLinkNative)(int type, const char *args); + +typedef void (*FuncCallHandlePostMessage)(const char *vimId, const char *data); + +typedef void +(*FuncCallDIspatchMessage)(const char *clientId, const char *data, const char *callback, + const char *vmId); + + +typedef struct WeexCoreJsCoreApiFunctions { + FuncSetJSVersion funcSetJSVersion; + FuncReportException funcReportException; + FuncCallNative funcCallNative; + FuncCallNativeModule funcCallNativeModule; + FuncCallNativeComponent funcCallNativeComponent; + FuncCallAddElement funcCallAddElement; + FuncSetTimeout funcSetTimeout; + FuncCallNativeLog funcCallNativeLog; + FuncCallCreateBody funcCallCreateBody; + FuncCallUpdateFinish funcCallUpdateFinish; + FuncCallCreateFinish funcCallCreateFinish; + FuncCallRefreshFinish funcCallRefreshFinish; + FuncCallUpdateAttrs funcCallUpdateAttrs; + FuncCallUpdateStyle funcCallUpdateStyle; + FuncCallRemoveElement funcCallRemoveElement; + FuncCallMoveElement funcCallMoveElement; + FuncCallAddEvent funcCallAddEvent; + FuncCallRemoveEvent funcCallRemoveEvent; + FuncSetInterval funcSetInterval; + FuncClearInterval funcClearInterval; + FuncCallGCanvasLinkNative funcCallGCanvasLinkNative; + FuncT3dLinkNative funcT3dLinkNative; + FuncCallHandlePostMessage funcCallHandlePostMessage; + FuncCallDIspatchMessage funcCallDIspatchMessage; +} WEEX_CORE_JS_API_FUNCTIONS; + +typedef struct InitFrameworkParams { + WeexByteArray *type; + WeexByteArray *value; +} INIT_FRAMEWORK_PARAMS; + + +enum class ParamsType { + INT32 = 1, + INT64, + FLOAT, + DOUBLE, + JSONSTRING, + STRING, + BYTEARRAY, /* terminated with zero. */ + VOID, + JSUNDEFINED, + END, +}; + + +typedef union ExecJsParamValue { + int32_t int32Value; + int64_t int64Value; + float floatValue; + double doubleValue; + WeexString *string; + WeexByteArray *byteArray; +} EXEC_JS_PARAM_VALUE; + +typedef struct ValueWithType { + ParamsType type; + EXEC_JS_PARAM_VALUE value; +} VALUE_WITH_TYPE; + + +typedef int (*FuncInitFramework)(const char *script, std::vector<INIT_FRAMEWORK_PARAMS *> params); + + +typedef int (*FuncInitAppFramework)(const char *instanceId, const char *appFramework, + std::vector<INIT_FRAMEWORK_PARAMS *> params); + +typedef int (*FuncCreateAppContext)(const char *instanceId, const char *jsBundle); + +typedef char *(*FuncExeJSOnAppWithResult)(const char *instanceId, const char *jsBundle); + +typedef int (*FuncCallJSOnAppContext)(const char *instanceId, const char *func, + std::vector<VALUE_WITH_TYPE *> params); + +typedef int (*FuncDestroyAppContext)(const char *instanceId); + +typedef int (*FuncExeJsService)(const char *source); + +typedef int (*FuncExeCTimeCallback)(const char *source); + +typedef int (*FuncExeJS)(const char *instanceId, const char *nameSpace, const char *func, + std::vector<VALUE_WITH_TYPE *> params); + +typedef char *(*FuncExeJSWithResult)(const char *instanceId, const char *nameSpace, + const char *func, + std::vector<VALUE_WITH_TYPE *> params); + +typedef int (*FuncCreateInstance)(const char *instanceId, const char *func, const char *script, + const char *opts, + const char *initData, const char *extendsApi); + +typedef char *(*FuncExeJSOnInstance)(const char *instanceId, const char *script); + +typedef int (*FuncDestroyInstance)(const char *instanceId); + +typedef int (*FuncUpdateGlobalConfig)(const char *config); + +typedef struct WeexCoreJsServerApiFunctions { + FuncInitFramework funcInitFramework; + FuncInitAppFramework funcInitAppFramework; + FuncCreateAppContext funcCreateAppContext; + FuncExeJSOnAppWithResult funcExeJSOnAppWithResult; + FuncCallJSOnAppContext funcCallJSOnAppContext; + FuncDestroyAppContext funcDestroyAppContext; + FuncExeJsService funcExeJsService; + FuncExeCTimeCallback funcExeCTimeCallback; + FuncExeJS funcExeJS; + FuncExeJSWithResult funcExeJSWithResult; + FuncCreateInstance funcCreateInstance; + FuncExeJSOnInstance funcExeJSOnInstance; + FuncDestroyInstance funcDestroyInstance; + FuncUpdateGlobalConfig funcUpdateGlobalConfig; +} WEEX_CORE_JS_SERVER_API_FUNCTIONS; + +#endif //WEEXV8_WEEXAPIHEADER_H