Android で env.rhino.js を使用して成功した他のレポートを読みました。また、Android アプリで rhino を正常に動作させ、簡単なスクリプトを実行して、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();
}
}
別の VERSION 設定も試してみましたが、何も役に立ちません。私が得るスタックトレースは次のとおりです。
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 コードを実行します。また、JavaScript コードを実行する代わりに WebView を使用するように言わないでください。ユーザーが画面上で何か他のことをしている間に、バックグラウンドで Web スクレイピングを行うために、Android サービスから呼び出すことができる JavaScript 機能を備えた「ヘッドレス ブラウザ」が必要です。
グレッグ