3

我阅读了其他人在 Android 上成功使用 env.rhino.js 的报告。我还让 rhino 在 Android 应用程序中正常工作并执行简单的脚本,在 Java 和 JavaScript 之间双向传递参数。但是,当我尝试使用 env.rhino.js 时,无论我找到和使用哪个版本的 envJ,也无论哪个 rhino(尝试过 rhino1_7R2、rhino1_7R5 和 rhino1_7R5pre),我都会收到 StackOverflowError。基于活动的类中的代码是:

public void envjsTest() {
    String envJs = convertAssetToString("env.rhino.js");
    Context cx = ContextFactory.getGlobal().enterContext();
    cx.setOptimizationLevel(-1);
    cx.setLanguageVersion(Context.VERSION_1_8);
    try {
        Scriptable scope = cx.initStandardObjects();
        cx.evaluateString(scope, envJs, "env.rhino.js", 1, null);
    } finally {
        Context.exit();
    }
}

也尝试了不同的版本设置,没有任何帮助。我得到的堆栈跟踪是:

01-18 14:27:18.389: ERROR/AndroidRuntime(2447): FATAL EXCEPTION: main
    java.lang.StackOverflowError
    at org.mozilla.javascript.Decompiler.appendString(Decompiler.java:208)
    at org.mozilla.javascript.Decompiler.addName(Decompiler.java:121)
    at org.mozilla.javascript.IRFactory.transformName(IRFactory.java:811)
    at org.mozilla.javascript.IRFactory.transform(IRFactory.java:120)
    at org.mozilla.javascript.IRFactory.transformInfix(IRFactory.java:738)
    at org.mozilla.javascript.IRFactory.transform(IRFactory.java:161)
    at org.mozilla.javascript.IRFactory.transformInfix(IRFactory.java:738)
    at org.mozilla.javascript.IRFactory.transform(IRFactory.java:161)
    at org.mozilla.javascript.IRFactory.transformInfix(IRFactory.java:738)
    at org.mozilla.javascript.IRFactory.transform(IRFactory.java:161)
    at org.mozilla.javascript.IRFactory.transformInfix(IRFactory.java:740)
    at org.mozilla.javascript.IRFactory.transform(IRFactory.java:161)
    at org.mozilla.javascript.IRFactory.transformInfix(IRFactory.java:740)
    at org.mozilla.javascript.IRFactory.transform(IRFactory.java:161)
    at org.mozilla.javascript.IRFactory.transformInfix(IRFactory.java:740)
    at org.mozilla.javascript.IRFactory.transform(IRFactory.java:161)
    at org.mozilla.javascript.IRFactory.transfor ...

这怎么可能解决?同样,一个类似的函数可以执行非常简单的 JavaScript 代码。而且,请不要告诉我改用 WebView 来执行 JavaScript 代码。我需要一个具有 JavaScript 功能的“无头浏览器”,可以从 Android 服务调用,在后台进行一些网页抓取,而用户则在屏幕上忙于其他事情。

格雷格

4

0 回答 0