如何在Android上执行JavaScript?
我有使用ScriptEngineManager的代码,ScriptEngine类用于使用Java执行JavaScript代码。但它在JavaSE中运行良好,在Android中不起作用-SDK显示缺少类的错误。可以在Android中执行JS代码吗?多谢各位 考虑到和是JDK的一部分,Android SDK与JDK不是一回事,我想说的是,您不能在Android下使用这些类来处理JavaScript如何在Android上执行JavaScript?,java,javascript,android,Java,Javascript,Android,我有使用ScriptEngineManager的代码,ScriptEngine类用于使用Java执行JavaScript代码。但它在JavaSE中运行良好,在Android中不起作用-SDK显示缺少类的错误。可以在Android中执行JS代码吗?多谢各位 考虑到和是JDK的一部分,Android SDK与JDK不是一回事,我想说的是,您不能在Android下使用这些类来处理JavaScript 您可以查看Android SDK以查看包含了哪些类(您可以在Android上现成使用哪些类)以及缺少哪
您可以查看Android SDK以查看包含了哪些类(您可以在Android上现成使用哪些类)以及缺少哪些类。将帮助您开始。ScriptEngine是java的东西。Android没有JVM,但有一个DalvikVM,它不是相同的,而是相似的。javax.script包不是Android SDK的一部分。您可以在WebView中执行JavaScript,如下所述。您也许可以使用,如上所述。您还可以查看该项目。您可以使用继承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上运行,而不是在本机环境中运行,因此您可能会在emulator中遇到延迟或慢速FPS。但是,在实际手机上使用时,代码可能运行得很快,这取决于您的手机速度。是一个很好的代码。下面是我为评估JavaScript编写的另一个小库:
它在幕后创建了一个网络视图。适用于Android版本3及更高版本。我刚刚找到了适用于Android的应用程序
JavaScript
,它是适用于Java的Rhino JavaScript引擎。它可以使用所有Java类,所以它有很大的潜力。问题是它可能很慢,因为它没有真正优化(CPU负载很重)。还有另一个名为Nashorn的JavaScript引擎,但不幸的是,它不能在Google的DalvikVM Java引擎上工作(不支持Oracle Java引擎的优化)。我希望谷歌能跟上,我会喜欢的 2018年更新:AndroidJSCore已被取代,它基于V8。它不仅包括V8引擎,而且所有Node.js都可用
原始答案:
是围绕Webkit的JavaScriptCore C库的Android Java JNI包装器。它的灵感来源于ios7自带的Objective-cjavascriptcore框架。能够在应用程序中以本机方式使用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"
);
}
公共接口IAsyncObj{
public void callMeMaybe(整数ms,JSValue callback)抛出JSException;
}
公共类AsyncObj扩展JSObject实现IAsyncObj{
公共AsyncObj(JSContext ctx)抛出JSException{super(ctx,IAsyncObj.class);}
@凌驾
public void callMeMaybe(整数ms,JSValue回调)引发JSException{
新建CallMeLater(ms.execute)(callback.toObject());
}
私有类CallMeLater扩展异步任务{
公用呼叫器(整数毫秒){
这个.ms=ms;
}
私有最终整数ms;
@凌驾
受保护的JSObject doInBackground(JSObject…参数){
试一试{
睡眠(ms);
}捕捉(中断异常e){
Thread.interrupted();
}
返回参数[0];
}
@凌驾
受保护的void onPostExecute(JSObject回调){
JSValue args[]={新JSValue(上下文,
“这是来自Java的延迟消息!”)};
试一试{
callback.callAsFunction(null,args);
}捕获(JSE异常){
系统输出打印ln(e);
}
}
}
}
public void run()引发JSException{
AsyncObj async=新的AsyncObj(上下文);
属性(“异步”,异步);
context.evaluateScript(
“日志('请在5秒钟后给我回电话');\n”+
async.callMeMaybe(5000,函数(msg){\n+
“警报(消息);\n”+
“日志('Whoomp.在那里');\n”+
“});\n”+
日志('async.callMeMaybe()已返回,但请等待…');\n
);
}
您可以使用Rhino
库在没有WebView的情况下执行JavaScript
首先,解压缩它,将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();
}
如果您想根据问题在chrome浏览器上运行一些javascript代码,请复制此代码并将其粘贴到地址栏中,请参见。
数据:text/html,
记事本
警报('Abhasker手机警报测试')
我也在寻找一种在Android上运行javascript的方法。这是谷歌v8引擎的java包装器
要使用它,请添加依赖项:
compile 'com.eclipsesource.j2v8:j2v8_android:3.0.5@aar'
它有非常简单的api,但除了在中的javadoc之外,我还没有在网上找到任何文档。有关的文章也很有用
代码示例来自:
仅供参考,若搜索引擎坏了,我相信谷歌会在这里找到一些重复的。右侧的“相关”块列出了其中至少一个。可能重复:&您的链接已断开。你能修复它吗?不是很好(因为它不是我的博客),但是archive.org有一个保存的副本:lat
compile 'com.eclipsesource.j2v8:j2v8_android:3.0.5@aar'
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();
}