如何在 Android 上执行 JavaScript?

IT技术 java javascript android
2021-01-20 17:48:18

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

6个回答

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

java中如何调用Cryptojs文件的encrypt方法对参数进行加密?这里有点混乱。请帮忙。
2021-03-16 17:48:18
@Evgenii 不错的个人资料图片。白鲸是革命:)
2021-03-16 17:48:18
2018 年更新: AndroidJSCore 已被基于 V8 的LiquidCore取代它不仅包括 V8 引擎,而且所有的 Node.js 都可用。
2021-04-12 17:48:18

您可以使用继承 View 类的 Webview。制作一个 XML 标签并使用findViewById()函数在活动中使用。但是要使用 JavaScript,您可以制作一个包含 JavaScript 代码的 HTML 文件。示例 blelow 可能会有所帮助。

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 缓慢的情况。但是,在实际手机上使用时,代码可能会运行得很快,具体取决于您手机的速度。

http://divineprogrammer.blogspot.com/2009/11/javascript-rhino-on-android.html会让你开始。ScriptEngine 是 Java 的东西。Android 没有 JVM,但有一个 DalvikVM,它不相同但相似。

不是很好(因为它不是我的博客)但是archive.org 有一个保存的副本:web.archive.org/web/20100201235324/http : //...
2021-03-18 17:48:18
你的链接坏了。你能修好吗?
2021-03-27 17:48:18

2018 年更新: AndroidJSCore 已被基于 V8 的LiquidCore取代它不仅包括 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<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"
    );
}
@Pavitra 固定。
2021-03-17 17:48:18
第一个链接坏了。有人修复它。
2021-04-03 17:48:18

我也在寻找一种在 Android 上运行 javascript 的方法,并遇到了j2v8 库这是 Google 的 v8 引擎的 Java 包装器。

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

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

它有非常简单的 api,但除了maven repository 中的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();
}
不要忘记导入: import com.eclipsesource.v8.V8;
2021-03-15 17:48:18
最新版本显示为 4.5.0。如何在“编译 'com.eclipsesource.j2v8:j2v8_android:3.0.5@aar'”中替换它。用 4.5.0 替换 3.0.5 不起作用。
2021-03-29 17:48:18
@AndroidGuy 最新的 Android 版本是 3.0.5,见mvnrepository.com/artifact/com.eclipsesource.j2v8/j2v8_android
2021-04-03 17:48:18