如何在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上现成使用哪些类)以及缺少哪

我有使用ScriptEngineManager的代码,ScriptEngine类用于使用Java执行JavaScript代码。但它在JavaSE中运行良好,在Android中不起作用-SDK显示缺少类的错误。可以在Android中执行JS代码吗?多谢各位

考虑到和是JDK的一部分,Android SDK与JDK不是一回事,我想说的是,您不能在Android下使用这些类来处理JavaScript


您可以查看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();
}