17

我正在开发一个 JavaScript 组件,它负责向服务器发出请求并将结果分派到 UI。通过在 JavaScript 中执行此操作,我可以在几种类型的 UI 中使用我的组件:Android 应用程序、iOS 应用程序、桌面应用程序 (QT)、Web 应用程序......

所有这些 UI 都实例化了一个 Web 视图,因此我的组件在 UI 加载专用 URL ( webview.load("file://myfirstWebPage.html")) 时启动。

第一个网页加载所有 JavaScript 组件,完成后,UI 能够向 JavaScript 组件发出一些请求,该组件向服务器发出请求,当它收到响应时,它会将其分派回客户端( UI Android,UI iOS ...)

这种架构工作得很好,但我想知道是否有另一种方法来加载 JavaScript 组件,而无需在每个客户端上使用 Web 视图?

V8引擎能帮到我吗?

4

4 回答 4

18

如果我理解您的问题,您正在寻找一种在不使用 WebView 的情况下跨多个平台(iOS、Android 等)执行 JavaScript 的方法。该解决方案将是特定于平台的,因为甚至每个平台的底层 WebView 实现都不同。

对于 Android,只要设备附带 V8,您就可以通过其 API 创建一个新的 V8 上下文并使用它来执行您的 JavaScript。该设备必须实际附带 V8。这个答案可能会进一步帮助你。

对于使用JavaScriptCore的 iOS, iOS7 的最新开发允许您加载和运行任意 JavaScript 代码。 在这里阅读更多

于 2013-10-17T23:25:09.207 回答
7

对于安卓部分。我使用了 J2V8 JavaScript 库。它是 Google V8 JavaScript 引擎的 Java 包装器。有关更多详细信息,请参见此处

于 2016-01-21T12:52:15.473 回答
6

我不知道如何使用V8,但您可以使用Rhinolibrary 代替。也没有涉及 WebView。

先下载Rhino,解压,将js.jar文件放到libs文件夹下。它非常小,因此您不必担心您的 apk 文件会因为这个外部 jar 文件而大得离谱。

下面是一些执行 JavaScript 代码的简单代码。

Object[] params = new Object[] { "javaScriptParam" };

// Every Rhino VM begins with the enter()
// This Context is not Android's Context
Context rhino = Context.enter();

// Turn off optimization to make Rhino Android compatible
rhino.setOptimizationLevel(-1);
try {
    Scriptable scope = rhino.initStandardObjects();

    // Note the forth argument is 1, which means the JavaScript source has
    // been compressed to only one line using something like YUI
    rhino.evaluateString(scope, javaScriptCode, "JavaScript", 1, null);

    // Get the functionName defined in JavaScriptCode
    Object obj = scope.get(functionNameInJavaScriptCode, scope);

    if (obj instanceof Function) {
        Function jsFunction = (Function) obj;

        // Call the function with params
        Object jsResult = jsFunction.call(rhino, scope, scope, params);
        // Parse the jsResult object to a String
        String result = Context.toString(jsResult);
    }
} finally {
    Context.exit();
}

您可以在我的帖子中查看更多详细信息。

于 2015-04-07T04:44:16.767 回答
1

我发现这个非常漂亮的开源 ECMAScript 兼容 JS 引擎完全用 C 语言编写,称为duktape

Duktape 是一个可嵌入的 Javascript 引擎,专注于便携性和紧凑的占用空间。

您仍然必须通过 ndk-jni 业务,但这非常简单。只需将来自可分发源的duktape.cand包含在此处(如果您不想自己完成构建过程)到 jni 文件夹中,更新 Android.mk 和所有这些东西。duktape.h

这是一个示例 C 代码片段,可帮助您入门。

#include "duktape.h"

JNIEXPORT jstring JNICALL
Java_com_ndktest_MainActivity_evalJS
(JNIEnv * env, jobject obj, jstring input){
    duk_context *ctx = duk_create_heap_default();
    const char *nativeString = (*env)->GetStringUTFChars(env, input, 0);
    duk_push_string(ctx, nativeString);
    duk_eval(ctx);
    (*env)->ReleaseStringUTFChars(env, input, nativeString);
    jstring result = (*env)->NewStringUTF(env, duk_to_string(ctx, -1));
    duk_destroy_heap(ctx);
    return result;
}

祝你好运!

于 2015-02-11T15:07:47.830 回答