在Javascript上使用Rhino的evaluateString()的Android StackOverflow错误

时间:2011-12-23 23:37:57

标签: javascript android jvm rhino dalvik

我尝试使用Rhino for Android,以便在私人网站上与此聊天服务进行互动。我实际上不需要使用应用程序查看聊天屏幕,这就是为什么我认为Rhino是一个很好的方法,因为它隐藏了所有的窗口/浏览内容。

1)这是否是正确的方法?我尝试这个的唯一原因是因为我听说WebViews不安全/最好的解决方案? (如果对我的情况不是这样的话,请在此纠正我!)

2)所以我刚刚下载了javascript,并试图在其上创建一个Context和evaluateString。我有合适的范围和所有这些。此外,我还确保将优化级别设置为-1,因为Dalvik代码不会运行从Rhino生成的JVM字节码。但是,我得到的错误是:

D/dalvikvm(  465): GC_FOR_MALLOC freed 1840 objects / 326872 bytes in 57ms
I/dalvikvm(  465): threadid=1: stack overflow on call to Lorg/mozilla/javascript/TokenStream;.getChar:I
I/dalvikvm(  465):   method requires 36+20+8=64 bytes, fp is 0x4186933c (60 left)
I/dalvikvm(  465):   expanding stack end (0x41869300 to 0x41869000)
I/dalvikvm(  465): Shrank stack (to 0x41869300, curFrame is 0x41869754)
D/dalvikvm(  465): GC_FOR_MALLOC freed 5607 objects / 262320 bytes in 47ms
W/dalvikvm(  465): Exception Lorg/mozilla/javascript/EvaluatorException; thrown during Lcom/test/testing/rhinochat/TestChat;.<clinit>
I/dalvikvm(  465): Rejecting re-init on previously-failed class Lcom/test/testing/rhinochat/TestChat; v=0x0
D/AndroidRuntime(  465): Shutting down VM
W/dalvikvm(  465): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
E/AndroidRuntime(  465): FATAL EXCEPTION: main
E/AndroidRuntime(  465): java.lang.NoClassDefFoundError: com.test.testing.rhinochat.TestChat
E/AndroidRuntime(  465):        at com.test.testing.rhinochat.TestChatRunner.run(TestChatRunner.java:46)
E/AndroidRuntime(  465):        at com.test.testing.rhinochat.StartChat.onCreate(StartChat.java:10)
E/AndroidRuntime(  465):        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
E/AndroidRuntime(  465):        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
E/AndroidRuntime(  465):        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
E/AndroidRuntime(  465):        at android.app.ActivityThread.access$2300(ActivityThread.java:125)
E/AndroidRuntime(  465):        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
E/AndroidRuntime(  465):        at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(  465):        at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime(  465):        at android.app.ActivityThread.main(ActivityThread.java:4627)
E/AndroidRuntime(  465):        at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(  465):        at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime(  465):        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
E/AndroidRuntime(  465):        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
E/AndroidRuntime(  465):        at dalvik.system.NativeStart.main(Native Method)
W/ActivityManager(   59):   Force finishing activity com.test.testing/.rhinochat.StartChat
W/ActivityManager(   59):   Force finishing activity com.test.testing/.RhinoOnAndroidActivity
W/ActivityManager(   59): Activity pause timeout for HistoryRecord{450a1240 com.test.testing/.rhinochat.StartChat}

我已经从Eclipse设置了最大允许的堆栈空间(我认为最长或者像这样荒谬的东西)并且仍然会出现此错误。用各种设备和相同的结果进行测试。

这里有一个问题:我在桌面上运行我的代码,即使没有编译器优化,一切都可以编译并运行完美。但是当我在Android上运行SAME EXACT代码时,它会崩溃。 (我已尝试过仿真器和多个硬件设备)

所以在这一点上我非常难过。有没有人知道为什么会这样?有没有一种方法可以让Dalvik在编译/运行这个javascript时表现得像JVM?这是javascript的错吗?如果是这样,我怎么会在同一个javascript的桌面上出现同样的错误?

更糟糕的是,我甚至不知道如何获得有关javascript错误抛出或堆栈跟踪或任何内容的任何提示

任何帮助或提示都会受到严重赞赏。

节日快乐,感谢你阅读这个问题。

1 个答案:

答案 0 :(得分:2)

好的,问题是我没有问正确的问题。我不应该吓坏了,扔了一大堆信息。

事实证明,如果设置最大堆栈大小,它就会完全被忽略。因此,通过将堆栈大小设置为相当合理的数量,它将起作用。当然,这需要使用堆栈空间进行调整,并确切地确定哪些内容可以正常工作。事实证明,使用100kb的堆栈空间对我来说已经足够了,因为我还把它放在一个单独的线程中。

Runnable r = new Runnable(){
    public void run(){
    //... evaluateString() function here ...
    }
}
final Thread t = new Thread(new ThreadGroup("A") , r, "my thread name", 100000);
t.start();