2013-05-01 3 views
0

ANTLR-3.5-complete.jar를 Android 앱에서 작동 시키려고했으나 제대로 작동하지 않습니다. 바트 키어 (Bart Kiers)의 대답 HERE은 많은 도움이되었지만 여전히 작동하지 않습니다.(Android) ANTLRStringStream 예외 발생

클릭했을 때 EditText보기의 텍스트가 내 grammar.g에 따라 올바른지 여부를 확인하지만 내가 입력 한 텍스트가 올바른지 여부는 중요하지 않습니다. ANTLRStringStream을 인스턴스화하는 동안 버튼을 클릭하면 내 앱이 항상 중단됩니다.

public void onClickVerify(View v) throws TypeNotPresentException { 
    String source = "foobar"; 
    Log.e("TestDebug", "Instantiating views"); 
    TextView out = (TextView) findViewById(R.id.textView1); 
    EditText in = (EditText) findViewById(R.id.editText1); 
    try { 
     Log.e("TestDebug", "Getting source from EditText"); 
     source = in.getText().toString(); 
     Log.e("TestDebug", "source = " + source); 
     Log.e("TestDebug", "Instantiating stream"); 
     ANTLRStringStream stream = new ANTLRStringStream(source); 
     Log.e("TestDebug", "Instantiating lexer"); 
     grammarLexer lexer = new grammarLexer(stream); 
     Log.e("TestDebug", "Instantiating parser"); 
     grammarParser parser = new grammarParser(
       new BufferedTokenStream(lexer)); 
     Log.e("TestDebug", "Applying rule to parser"); 
     out.setText(source + " = " + !parser.failed()); 
    } catch (IllegalStateException ise) { 
     out.setText("Exception caught"); 
    } 
} 

그리고 여기에 내가 로그에서 볼 수있는 작업은 다음과 같습니다 : 여기가 무슨 인스턴스화 스트림 test33

  • = 글고
  • 소스에서 소스를 얻기

    • 인스턴스화 전망

    그런 다음 "불행히도 Tes tAntlrApp가 중지되었습니다. " 창이 열립니다.

    편집 : 내 logcat 더있어.

    java.lang.IllegalStateException: Could not execute method of the activity 
    at android.view.View$1.onClick(View.java:3591) 
    at android.view.View.performClick(View.java:4084) 
    at android.view.View$PerformClick.run(View.java:16966) 
    at android.os.Handler.handleCallback(Handler.java:615) 
    at android.os.Handler.dispatchMessage(Handler.java:92) 
    at android.os.Looper.loop(Looper.java:137) 
    at android.app.ActivityThread.main(ActivityThread.java:4745) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:511) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
    at dalvik.system.NativeStart.main(Native Method) 
    Caused by: java.lang.reflect.InvocationTargetException 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:511) 
    at android.view.View$1.onClick(View.java:3586) 
    ... 11 more 
    Caused by: java.lang.NoClassDefFoundError: org.antlr.runtime.ANTLRStringStream 
    at com.test.antlr.MainActivity.onClickVerify(MainActivity.java:89) 
    

    클래스 ANTLRStringStream 클래스를 찾을 수 없습니다. 그러나 코드에 오류/경고가없는 것 같아 클래스의 계층 구조를 볼 수도 있습니다.

  • +0

    이전 답변에서 언급 한 ANTLR 버전을 사용하면 어떻게됩니까? –

    +0

    그리고 어떤 예외가 발생 했습니까? 'catch'를 이것으로 바꾸고 log-cat에 보이는 것을 게시하십시오 : catch (Exception e) { Log.e ("TestDebug", "Exception caught :", e); }' –

    +0

    @BartKiers ANTLR 버전을 변경하고 어떤 결과가 발생하는지 살펴 보겠습니다! 'catch '를 변경했지만 코드가 실행되지 않습니다. 'catch'에 도달하지 않고'try' 내에서 충돌합니다. 따라서 로그 출력은 동일하게 유지됩니다. 편집 : v3.3이 ANTLR 웹 사이트에서 삭제 된 것으로 보입니다. 나는 v3.5 만 찾을 수있다. – Cramps

    답변

    0

    최근의 ADT 업데이트로 인해 Eclipse의 일반적인 방식으로 외부 경로를 빌드 경로에 추가 할 수 없습니다. 대신 .apk 안에 포장하기 위해 libs 폴더 안에 넣어야합니다. 빌드 경로에 추가하기 만하면 .apk를 빌드 할 때 무시됩니다.

    증상 : 앱이 외부 라이브러리 클래스를 인식하지 못했습니다.

    해결 방법 : .jar 파일을 libs 폴더에 넣으십시오.