2011-12-23 6 views
2

개인 웹 사이트에서이 채팅 서비스와 상호 작용하기 위해 Android 용 Rhino를 사용하려고합니다. 사실 앱에서 채팅 화면을 볼 필요가 없으므로 Rhino가 모든 창/브라우저 항목을 숨기 때문에 Rhino가 좋은 접근 방법이라고 생각한 것입니다.자바에서 Rhino의 evaluateString()을 사용하는 Android StackOverflow 오류

1) 이것이 올바른 접근 방법입니까? 내가 WebViews 안전/가장 좋은 솔루션이 아니었다는 것을 들었 기 때문에 내가 이것을 시도하는 유일한 이유는 무엇입니까? (내 상황에 대해 전혀 사실이 아닐 경우이 문제를 해결하십시오.)

2) 그래서 자바 스크립트를 다운로드하고 컨텍스트 및 evaluateString을 만들려고했습니다. 나는 올바른 범위와 모든 것을 가지고 있습니다. 또한 Dalvik 코드는 Rhino에서 생성 된 JVM 바이트 코드를 실행하지 않기 때문에 최적화 수준을 -1로 설정했습니다. 그러나, 내가지고있어 오류가 이것이다 :

내가 이클립스에서 최대 허용 스택 공간을 설정 한
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} 

은 (내가 생각하는 긴 최대 또는 그런 말도 안되는 일)과 여전히 오류가 발생. 다양한 장치 및 동일한 결과로 테스트되었습니다.

다음은 catch입니다. 내 데스크톱에서 코드를 실행하면 모든 것이 컴파일러에서 최적화되지 않아도 완벽하게 컴파일되고 실행됩니다. 하지만 Android에서 SAME EXACT 코드를 실행하면 충돌이 발생합니다. (나는 에뮬레이터와 여러 개의 하드웨어 장치를 모두 시험해 보았습니다.)

그래서이 시점에서 나는 아주 난리를 겪었습니다. 왜 이런 일이 일어나는 지 아무도 모르는 사람이 있습니까? Dalvik을 컴파일 할 때/Javascript를 실행할 때 JVM처럼 동작시킬 수있는 방법이 있습니까? 이게 자바 스크립트의 잘못이야? 그렇다면 동일한 자바 스크립트로 내 데스크톱에서 같은 오류가 발생하지 않는 이유는 무엇입니까?

내가 심지어 자바 스크립트 오류가 던지는 내용에 어떤 힌트를 얻을하는 방법을 모른다, 설상가상으로, 또는 스택 추적 또는 아무것도

어떤 도움이나 힌트는 심각하게 감상 할 수있다.

해피 홀리데이와 질문을 읽어 주셔서 감사합니다.

답변

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(); 
+0

덕분에 많은 도움이되었습니다. – ajh158

+0

기꺼이 서비스 중입니다 :) 나는이 이상한 애매한 오류를 싫어합니다. –