当前位置:  开发笔记 > 编程语言 > 正文

如何在Android上执行JavaScript?

如何解决《如何在Android上执行JavaScript?》经验,为你挑选了7个好方法。

我有使用ScriptEngineManager,ScriptEngine类的代码,用于使用Java执行JavaScript代码.但它在Java SE中运行良好,并且在Android中不起作用 - SDK显示缺少类的错误.是否可以在Android中执行JS代码?谢谢.



1> Evgenii..:

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及更高版本.


**更新2018年:**AndroidJSCore已被[LiquidCore](https:// github/LiquidPlayer/LiquidCore)取代,它基于V8.它不仅包括V8引擎,而且还提供所有Node.js.

2> noob..:

您可以使用继承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.但是,在实际手机上使用时,代码可能会快速运行,具体取决于手机的速度.



3> Fredrik..:

http://divineprogrammer.blogspot.com/2009/11/javascript-rhino-on-android.html将帮助您入门.ScriptEngine是一个java的东西.Android没有JVM,但是没有相同但相似的DalvikVM.



4> Eric Lange..:

UPDATE 2018: AndroidJSCore已被取代LiquidCore,这是基于V8.它不仅包括V8引擎,而且还提供所有Node.js.

原始答案: AndroidJSCore是围绕Webkit的JavaScriptCore C库的Android Java JNI包装器.它的灵感来自iOS 7中原生包含的Objective-C JavaScriptCore框架.能够在应用程序中原生使用JavaScript,而无需在臃肿,缓慢,安全受限的WebView上使用JavaScript注入,这对于许多类型的应用程序非常有用,例如支持插件的游戏或平台.但是,它的使用是人为限制的,因为该框架仅在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 {
        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"
    );
}



5> Ted Hopp..:

javax.script包不是Android SDK的一部分.描述您可以在WebView中执行JavaScript,在这里.你或许可以用犀牛,描述在这里.您还可以查看Android脚本层项目.



6> Wesley..:

您可以使用Rhino库来执行不带WebView的JavaScript.

首先下载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();
}

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



7> Keammoort..:

我也在寻找一种在Android上运行javascript并遇到j2v8库的方法.这是谷歌v8引擎的java包装器.

要使用它,请添加依赖项:

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

它有非常简单的api,但除了maven存储库中的 javadoc之外,我还没有找到任何在线文档.他们博客上的文章也很有用.

本文的代码示例:

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


@AndroidGuy适用于Android的最新版本是3.0.5,请参阅https://mvnrepository.com/artifact/com.eclipsesource.j2v8/j2v8_android
推荐阅读
牛尾巴2010
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有