我有使用ScriptEngineManager,ScriptEngine类的代码,用于使用Java执行JavaScript代码.但它在Java SE中运行良好,并且在Android中不起作用 - 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) } });
它在幕后创建了一个WebView.适用于Android版本3及更高版本.
您可以使用继承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.但是,在实际手机上使用时,代码可能会快速运行,具体取决于手机的速度.
http://divineprogrammer.blogspot.com/2009/11/javascript-rhino-on-android.html将帮助您入门.ScriptEngine是一个java的东西.Android没有JVM,但是没有相同但相似的DalvikVM.
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" ); }
javax.script包不是Android SDK的一部分.描述您可以在WebView中执行JavaScript,在这里.你或许可以用犀牛,描述在这里.您还可以查看Android脚本层项目.
您可以使用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(); }
您可以在我的帖子中查看更多详细信息.
我也在寻找一种在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(); }