Ошибка Android StackOverflow при использовании Rhino'sвестиString () на Javascript - PullRequest
2 голосов
/ 24 декабря 2011

Я пытаюсь использовать Rhino для Android, чтобы взаимодействовать с этой службой чата на частном веб-сайте.На самом деле мне не нужно смотреть на экран чата с приложением, поэтому я подумал, что Rhino - это хороший подход, потому что он скрывает все окна / браузер.

1) это даже правильноподход?единственная причина, по которой я пытаюсь это сделать, заключается в том, что я слышал, что WebViews не были безопасными / лучшим решением?(пожалуйста, исправьте меня в этом, если это совсем не так для моей ситуации!)

2), поэтому я просто скачал javascript и попытался создать Context и оценивать строку String для этого.у меня правильная сфера и все такое.Кроме того, я также позаботился о том, чтобы установить уровень оптимизации -1, потому что код Dalvik не будет запускать байт-код JVM, сгенерированный из Rhino.однако, ошибка, которую я получаю, такова:

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, он вылетает.(я пробовал как эмулятор, так и несколько аппаратных устройств)

, так что на данный момент я очень озадачен.Кто-нибудь знает, почему это происходит?Есть ли способ заставить Dalvik вести себя как JVM при компиляции / запуске этого JavaScript?это вина Javascript?и если да, то почему я не получаю ту же ошибку на рабочем столе с тем же javascript?

Что еще хуже, я даже не знаю, как получить какие-либо подсказки о том, что такое ошибка javascriptметание, или трассировка стека, или что-нибудь еще

ЛЮБАЯ помощь или подсказки будут очень признательны.

Счастливых праздников и спасибо за чтение вопроса.

1 Ответ

2 голосов
/ 25 декабря 2011

хорошо, проблема была в том, что я не задал правильный вопрос. Я не должен был волноваться и выбрасывать кучу информации.

получается, что если вы установите максимальный размер стека, он просто полностью игнорируется. поэтому, установив размер стека на достаточно разумную величину, он будет работать. конечно, для этого нужно настроить пространство стека и точно определить, в какой момент все будет работать. получается, что использования 100 КБ стекового пространства мне было достаточно, учитывая, что я также поместил его в отдельный поток.

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