web-dev-qa-db-ja.com

V8 JavaScriptエンジンを使用してWebビューなしでJS libを実行する

サーバーへのリクエストとUIへの結果のディスパッチを担当するJavaScriptコンポーネントを開発しています。これをJavaScriptで行うことにより、いくつかのタイプのUIでコンポーネントを使用できます:Androidアプリ、iOSアプリ、デスクトップアプリ(QT)、ウェブアプリ...

これらすべてのUIはWebビューをインスタンス化しているため、UIが専用URL(webview.load("file://myfirstWebPage.html"))をロードすると、コンポーネントが開始されます。

この最初のWebページはすべてのJavaScriptコンポーネントをロードし、完了すると、UIはJavaScriptコンポーネントにいくつかの要求を行うことができます。これにより、サーバーに要求が行われ、応答があると、UIがクライアントにディスパッチします( UI Android、UI iOS ...)

このアーキテクチャは正常に動作しますが、知りたいと思います各クライアントでWebビューを使用せずにJavaScriptコンポーネントをロードする別の方法がある場合

V8エンジンは役に立ちますか?

16
wawanopoulos

私があなたの質問を理解している場合、WebViewを使用せずに多くのプラットフォーム(iOS、Androidなど)でJavaScriptを実行する方法を探しています。基盤となるWebView実装でさえプラットフォームごとに異なるため、ソリューションはプラットフォーム固有になります。

Androidの場合、デバイスにV8が同梱されている限り、 そのAPIを介して新しいV8コンテキストを作成 し、それを使用してJavaScriptを実行できます。デバイスは実際にはV8とともに出荷される必要があります。 この回答 がさらに役立つ場合があります。

JavaScriptCore を使用するiOSの場合、任意のJavaScriptコードをロードして実行できるように、iOS7で最近開発されました。 詳細はこちら

17
Andrew

Androidの部分。私は J2V8 JavaScriptライブラリを使用しました。これはJava GoogleのV8 JavaScriptエンジンのラッパーです。参照してください- ここ 詳細。

6
Angelo

V8の使い方はわかりませんが、代わりにRhinoライブラリを使用できます。関連するWebViewもありません。

Rhinoをダウンロード 最初に解凍し、js.jarファイルをlibsフォルダーに配置します。これは非常に小さいので、この1つの外部jarのために、apkファイルが途方もなく大きくなることを心配する必要はありません。

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();
}

詳細は my post で確認できます。

6
Wesley

私は完全にCで記述された duktape という、本当に気の利いたオープンソースECMAScript準拠のJSエンジンを見つけました

Duktapeは、移植性とコンパクトなフットプリントに重点を置いた、埋め込み可能なJavascriptエンジンです。

あなたはまだndk-jniビジネスを通過する必要がありますが、それはかなり簡単です。 duktape.cおよびduktape.h配布可能なソースから here (自分でビルドプロセスを実行したくない場合)jniフォルダーに、Android.mkとその他すべてのものを更新します。

開始するためのサンプル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;
}

幸運を!

1
Pawan Kumar