我有使用 ScriptEngineManager、ScriptEngine 类使用 Java 执行 JavaScript 代码的代码。但它在 Java SE 中运行良好,在 Android 中不起作用 - SDK 显示缺少类的错误。是否可以在Android中执行JS代码?谢谢你。
如何在 Android 上执行 JavaScript?
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 及更高版本。
您可以使用继承 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,它不相同但相似。
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"
);
}
我也在寻找一种在 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();
}