如何在 Android 上执行 JavaScript?

Posted

技术标签:

【中文标题】如何在 Android 上执行 JavaScript?【英文标题】:How to execute JavaScript on Android? 【发布时间】:2012-01-12 12:38:09 【问题描述】:

我有使用 ScriptEngineManager 的代码,ScriptEngine 类用于使用 Java 执行 javascript 代码。但它在 Java SE 中运行良好,在 android 中不起作用 - SDK 显示缺少类的错误。是否可以在 Android 中执行 JS 代码?谢谢你。

【问题讨论】:

仅供参考,如果搜索引擎坏了,我相信谷歌会在这里找到几个重复的。右侧的“相关”块至少列出了其中一个。 可能重复:***.com/questions/7544671/… & ***.com/questions/7042710/… 【参考方案1】:

鉴于 ScriptEngineManager 和 ScriptEngine 是 JDK 的一部分,而 Android SDK 与 JDK 不同,我会说你不能使用这些类在 Android 下使用 JavaScript。

您可以查看 Android SDK 的 reference documentation/package index 以查看包含哪些类(您可以在 Android 上开箱即用地使用哪些类)以及缺少哪些类。

【讨论】:

【参考方案2】:

http://divineprogrammer.blogspot.com/2009/11/javascript-rhino-on-android.html 将帮助您入门。 ScriptEngine 是一个 java 的东西。 Android 没有 JVM,而是有一个 DalvikVM,它不完全相同但相似。

【讨论】:

您的链接已损坏。你能修好吗? 不是很好(因为它不是我的博客),但 archive.org 有一个保存的副本:web.archive.org/web/20100201235324/http://…【参考方案3】:

javax.script 包不是 Android SDK 的一部分。您可以在 WebView 中执行 JavaScript,如 here 所述。您也许可以使用Rhino,如here 所述。您还可以查看Scripting Layer for Android 项目。

【讨论】:

sl4a 库过时【参考方案4】:

您可以使用继承 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。但是,在实际手机上使用时,代码可能会运行得很快,具体取决于您手机的速度。

【讨论】:

【参考方案5】:

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 及更高版本。

【讨论】:

如何调用Cryptojs文件的encrypt方法对java中的参数进行加密?这里有点混乱。请帮忙。 2018 年更新: AndroidJSCore 已被基于 V8 的 LiquidCore 取代。它不仅包括 V8 引擎,而且所有的 Node.js 都可用。 @Evgenii 漂亮的头像。白鲸是革命:)【参考方案6】:

我刚刚找到了 App JavaScript for Android,它是用于 Java 的 Rhino JavaScript 引擎。它可以使用所有的 Java 类,所以它有很大的潜力。问题是它可能很慢,因为它没有真正优化(CPU 负载很重)。还有另一个名为 Nashorn 的 JavaScript 引擎,但不幸的是,它不适用于 Google 的 DalvikVM Java 引擎(不支持 Oracle Java 引擎的优化)。我希望 Google 能跟上这一点,我会喜欢它!

【讨论】:

【参考方案7】:

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"
    );

【讨论】:

第一个链接坏了。有人修复它。 @Pavitra 已修复。【参考方案8】:

您可以使用Rhino 库在没有 WebView 的情况下执行 JavaScript。

Download 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();

您可以在my post查看更多详细信息。

【讨论】:

【参考方案9】:

如果您想根据问题在 chrome 浏览器上运行一些 javascript 代码,请复制此代码并将其粘贴到地址栏中:

data:text/html, &lt;html contenteditable&gt; &lt;title&gt; Notepad &lt;/title&gt; &lt;script&gt; alert('Abhasker 手机上的警报测试'); &lt;/script&gt;&lt;/html&gt;

【讨论】:

【参考方案10】:

我也在寻找一种在 Android 上运行 javascript 的方法,结果遇到了j2v8 library。这是 Google v8 引擎的 java 包装器。

要使用它,请添加一个依赖项:

compile 'com.eclipsesource.j2v8:j2v8_android:3.0.5@aar'

它有非常简单的 api,但除了 maven repository 中的 javadoc 之外,我还没有在网上找到任何文档。 their blog上的文章也很有用。

来自this article的代码示例:

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();

【讨论】:

最新版本显示4.5.0。如何在“compile 'com.eclipsesource.j2v8:j2v8_android:3.0.5@aar'”中替换它。用 4.5.0 替换 3.0.5 不起作用。 @AndroidGuy Android 的最新版本是 3.0.5,请参阅 mvnrepository.com/artifact/com.eclipsesource.j2v8/j2v8_android 别忘了导入:import com.eclipsesource.v8.V8;

以上是关于如何在 Android 上执行 JavaScript?的主要内容,如果未能解决你的问题,请参考以下文章

javascrip

Javascrip随笔1

如何在 Android 上执行 JavaScript?

如何使用 AccessibilityService 在 Android 上执行拖动(基于 X、Y 鼠标坐标)?

JavaScrip实现:如何写出漂亮的条件表达式

JavaScrip实现:如何写出漂亮的条件表达式