web-dev-qa-db-ja.com

AndroidでJavaScriptを実行する方法は?

Javaを使用してJavaScriptコードを実行するScriptEngineクラスのScriptEngineManagerを使用するコードがあります。しかし、Java SEでは正常に動作し、Android-SDKはクラスが見つからないというエラーを表示します。AndroidでJSコードを実行することは可能ですか? ? ありがとうございました。

44
user1078760

AndroidJSCore はすばらしいものです。 JavaScriptを評価するために作成した別の小さなライブラリを次に示します。

https://github.com/evgenyneu/js-evaluator-for-Android

jsEvaluator.evaluate("function hello(){ return 'Hello world!'; } hello();", new JsCallback() {
  @Override
  public void onResult(final String result) {
    // get result here (optional)
  }
});

背後でWebViewを作成します。動作するAndroidバージョン3以降。

17
Evgenii

Viewクラスを継承するWebviewを使用できます。 XMLタグを作成し、アクティビティで使用するfindViewById()関数を使用します。ただし、JavaScriptを使用するには、JavaScriptコードを含むHTMLファイルを作成できます。ブレローの例が役立つかもしれません。

Webview browser=(Webview) findViewById(R.main.browser); //if you gave the id as browser
browser.getSettings().setJavaScriptEnabled(true); //Yes you have to do it
browser.loadUrl("file:///Android_asset/JsPage.html"); //If you put the HTML file in asset folder of Android

JSはネイティブ環境ではなくWebViewで実行されるため、エミュレーターで遅延またはFPSが発生する可能性があることに注意してください。ただし、実際の電話で使用する場合、電話の速度に応じて、コードが高速で実行される場合があります。

13
noob

http://divineprogrammer.blogspot.com/2009/11/javascript-rhino-on-Android.html で開始できます。 ScriptEngineはJava thing。AndroidにはJVMはありませんが、DalvikVMは同一ではありませんが類似しています。

7
Fredrik

UPDATE 2018:AndroidJSCoreは、V8に基づく LiquidCore に置き換えられました。 V8エンジンが含まれているだけでなく、Node.jsもすべて利用可能です。

元の答えAndroidJSCore is Android Java = WebkitのJavaScriptCore CライブラリのJNIラッパー。iOS7にネイティブに含まれるObjective-C JavaScriptCore Frameworkからインスピレーションを受けています。 WebViewは、プラグインをサポートするゲームやプラットフォームなど、多くの種類のアプリに非常に役立ちますが、フレームワークはiOSでのみサポートされているため、その使用は人為的に制限されています。 。AndroidJSCoreは、その要件をサポートするように設計されました。

たとえば、Javaオブジェクトを共有し、非同期呼び出しを行うことができます。

public interface IAsyncObj {
    public void callMeMaybe(Integer ms, JSValue callback) throws JSException;
}
public class AsyncObj extends JSObject implements IAsyncObj {
    public AsyncObj(JSContext ctx) throws JSException { super(ctx,IAsyncObj.class); }
    @Override
    public void callMeMaybe(Integer ms, JSValue callback) throws JSException {
        new CallMeLater(ms).execute(callback.toObject());
    }

    private class CallMeLater extends AsyncTask<JSObject, Void, JSObject> {
        public CallMeLater(Integer ms) {
            this.ms = ms;
        }
        private final Integer ms;
        @Override
        protected JSObject doInBackground(JSObject... params) {
            try {
                Thread.sleep(ms);
            } catch (InterruptedException e) {
                Thread.interrupted();
        }
            return params[0];
        }

        @Override
        protected void onPostExecute(JSObject callback) {
            JSValue args [] = { new JSValue(context,
                    "This is a delayed message from Java!") };
             try {
                 callback.callAsFunction(null, args);
             } catch (JSException e) {
                 System.out.println(e);
             }
        }
    }
}

public void run() throws JSException {
    AsyncObj async = new AsyncObj(context);
    context.property("async",async);
    context.evaluateScript(
        "log('Please call me back in 5 seconds');\n" +
        "async.callMeMaybe(5000, function(msg) {\n" +
        "    alert(msg);\n" +
        "    log('Whoomp. There it is.');\n" +
        "});\n" +
        "log('async.callMeMaybe() has returned, but wait for it ...');\n"
    );
}
7
Eric Lange

また、Androidでjavascriptを実行し、 j2v8ライブラリ に遭遇しました。これはGoogleのラッパーですJava v8エンジン。

使用するには、依存関係を追加します。

compile 'com.eclipsesource.j2v8:j2v8_Android:3.0.5@aar'

それはかなり単純なAPIを持っていますが、 mavenリポジトリ でjavadoc以外にオンラインでドキュメントを見つけていません。 their blog の記事も役立ちます。

この記事 からのコードサンプル:

public static void main(String[] args) {
    V8 runtime = V8.createV8Runtime();

    int result = runtime.executeIntegerScript(""
        + "var hello = 'hello, ';\n"
        + "var world = 'world!';\n"
        + "hello.concat(world).length;\n");

    System.out.println(result);

    runtime.release();
}
6
Keammoort

Javax.scriptパッケージは、Android SDKの一部ではありません。説明されている here のように、WebViewでJavaScriptを実行できます。 Rhinoこちら で説明されているように、Android用の スクリプト層 プロジェクト。

6
Ted Hopp

Rhinoライブラリを使用して、WebViewなしでJavaScriptを実行できます。

Rhinoのダウンロード 最初に解凍し、js.jarファイルをlibsフォルダーの下に配置します。非常に小さいので、この外部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

ScriptEngineManager および ScriptEngine[〜#〜] jdk [〜#〜]およびAndroid SDKはJDKと同じものではありません。これらのクラスを使用してAndroidでJavaScriptを操作することはできません。

Android SDKの リファレンスドキュメント/パッケージインデックス をチェックして、含まれているクラスを確認できます(何に取り組むことができるかAndroid out箱の)とそれらのどれが欠落しています。

1

アプリを見つけましたJavaScript for Android、これはJava用のRhino JavaScriptエンジンです。すべてのJavaクラスを使用できるため、大きな可能性があります。問題は、実際には最適化されていない(重いCPU負荷)ため、時間がかかる可能性があることです。 Nashornという名前の別のJavaScriptエンジンがありますが、残念ながらGoogleのDalvikVM Javaエンジンでは動作しません(Oracle Javaエンジンの最適化をサポートしません)。 Googleがそれに追いつくことを願っています、ただそれだと思います!

1
lama12345

chromeブラウザで質問に従ってJavaScriptコードを実行する場合は、このコードをコピーしてアドレスバーに貼り付けます。

data:text/html、<html contenteditable><title>メモ帳</title><script> alert( 'Abhasker Alert Test on Mobile'); </script></html>

0
AbhiNickz