我阅读了其他人在 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 服务调用,在后台进行一些网页抓取,而用户则在屏幕上忙于其他事情。
格雷格