如何在Android上执行JavaScript?
我有使用ScriptEngineManager,ScriptEngine类的代码使用Java执行JavaScript代码。 但它在Java SE中工作正常,并且在Android中不起作用 – 缺less类的SDK显示错误。 是否有可能在Android中执行JS代码? 谢谢。
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) } });
它在幕后创build一个WebView。 适用于Android版本3及更新版本。
您可以使用inheritanceView类的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,它不相同,但相似。
javax.script包不是Android SDK的一部分。 您可以在WebView中执行JavaScript,如此处所述。 你也许可以使用Rhino ,如下所述。 您也可以查看Android项目的脚本层 。
AndroidJSCore是围绕Webkit的JavaScriptCore C库的Android Java JNI包装器。 它受iOS 7本身包含的Objective-C JavaScriptCore框架的启发。能够在应用程序中本地使用JavaScript而无需在臃肿,缓慢,受安全约束的WebView上使用JavaScript注入,这对于许多types的应用程序非常有用如支持插件的游戏或平台。 但是,由于该框架仅在iOS上受支持,因此其使用受到人为限制。 大多数开发人员都希望使用可扩展两种主stream移动操作系统的技术。 AndroidJSCore被devise来支持这个要求。
例如,您可以共享Java对象并进行asynchronous调用:
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" ); }
您可以使用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(); }
你可以在我的post中看到更多细节。
我也在寻找一种在Android上运行javascript的方法,并且遇到了j2v8库 。 这是Google的v8引擎的java包装器。
要使用它,添加一个依赖项:
compile 'com.eclipsesource.j2v8:j2v8_android:3.0.5@aar'
它有一个非常简单的API,但我没有在网上find任何文件,除了从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(); }
鉴于ScriptEngineManager和ScriptEngine是JDK的一部分, Android SDK和JDK不一样,我会说你不能在Android下使用这些类来处理JavaScript。
您可以检查Android SDK的参考文档/软件包索引,以查看包含哪些类(您可以在Android上使用哪些工具),以及缺less哪些类。
我刚刚findJavaScript for Android
的App JavaScript for Android
,这是适用于Java的Rhino JavaScript引擎。 它可以使用所有的Java类,所以它有很大的潜力。 问题是它可能会很慢,因为它没有真正优化(CPU负载过重)。 还有另外一个名为Nashorn的JavaScript引擎,但不幸的是它不适用于Google的DalvikVM Java引擎(不支持对Oracle Java引擎的优化)。 我希望Google跟上这一点,我会喜欢它!
如果您想在Chrome浏览器上运行一些JavaScript代码,请按照以下问题复制此代码并将其粘贴到地址栏中:
data:text / html, <html contenteditable>
<title>
记事本</title>
<script>
alert('Abhasker Alert Test on Mobile'); </script>
</html>