2017-03-09 6 views
0

일부 터치 이벤트를 원시 코드 (ARM)로 전달한 후 오류없이 애플리케이션이 충돌합니다. 이것은 네이티브 처리기가 시스템 로그에 메시지를 쓰고 GLSurfaceView.onTouchEvent()에서 호출 된 경우에만 발생합니다. 크래시는 즉시 발생하지는 않지만 2..10 이후에 발생하며 원시 코드 내부에없는 것으로 보입니다. LogI (...)를 원시 코드에서 제거하더라도 작동합니다. 하지만 다른 곳 (예 : onDrawFrame())에서 동일한 기본 함수를 호출하면 충돌없이 작동합니다.Android : 기본 터치 핸들러를 호출 한 후 프로세스가 종료되었습니다.

이것은 Android Emulator (ARM)와 실제 장치 모두에서 발생합니다.

private class JNIView extends GLSurfaceView { 
    @Override public boolean onTouchEvent (MotionEvent event) { 
     Log.i(TAG,"{"); 
     AppTouch(1, 2, 1); // <---- problem! 
     Log.i(TAG,"}"); 
     return true; 
    } 
.... 

private class MyRenderer implements GLSurfaceView.Renderer { 
    public void onDrawFrame(GL10 gl) { 
     AppDrawFrame(); 
     AppTouch(1, 2, 1); // <---- NO problem! 
    } 
... 
public native void AppTouch(float x, float y, int action); 

네이티브 코드 (파스칼) : 여기

내 자바 코드

procedure AppTouch(env:PJNIEnv; this:jobject; x,y:jfloat; action:jint); 
begin 
    try 
    LogI('AppTouch: '); // <<<------ Crashing depends on this line!!! 
    except 
    on e:exception do LogI('Error in AppTouch: '+ExceptionMsg(e)); 
    end; 
end; 

로그 캣 :

I/ApusLib (18690): { 
I/ApusLib (18690): AppTouch: 
I/ApusLib (18690): } 
I/ApusLib (18690): { 
I/ApusLib (18690): AppTouch: 
I/ApusLib (18690): } 
I/ActivityManager( 953): Process apus.engine3 (pid 18690) has died. 
I/WindowState( 953): WIN DEATH: Window{ae0e2160 u0 apus.engine3/apus.engine3.JNIActivity} 
W/ActivityManager( 953): Force removing ActivityRecord{ae02b330 u0 apus.engine3/.JNIActivity}: app died, no saved state 
W/WindowManager( 953): Force-removing child win Window{ae0e5a70 u0 SurfaceView} from container Window{ae0e2160 u0 apus.engine3/apus.engine3.JNIActivity} 
D/Zygote ( 648): Process 18690 exited cleanly (255) 
W/WindowManager( 953): Failed looking up window 
W/WindowManager( 953): java.lang.IllegalArgumentException: Requested window [email protected] does not exist 

가 더있는 스택 추적 없거나 로그에 덤프 . 애플리케이션 종료의 정확한 이유를 알아낼 방법이 있습니까?

답변

0

내 기본 라이브러리의 스레딩 문제로 보입니다. 터치 핸들러가 드로잉 코드가 실행 중일 때 다른 스레드에서 호출되어 무언가가 손상되었습니다.

cthreads 단위를 추가하면 문제가 해결됩니다. http://forum.lazarus.freepascal.org/index.php?topic=17427.0