2017-03-09 13 views
0

ネイティブコード(ARM)に少数のタッチイベントを渡してもエラーが発生せずクラッシュしました。これは、ネイティブハンドラがシステムログにメッセージを書き込む場合にのみ発生し、GLSurfaceView.onTouchEvent()から呼び出された場合にのみ発生します。クラッシュは即座に発生するのではなく、2.10の呼び出し後に発生し、ネイティブコード内にはないようです。 LogI(...)をネイティブコードで削除しても、動作します。しかし、別の場所(例えばonDrawFrame()から)から同じネイティブ関数を呼び出すと、クラッシュなしで動作します。アンドロイド:ネイティブタッチハンドラを呼び出した後にプロセスが終了しました

これは、Androidエミュレータ(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; 

Logcat:

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 

そこには任意のスタックトレースがあるか、ログにダンプここ

は私のJavaコードであります。アプリケーション終了の理由を知る方法はありますか?

答えて

0

私のネイティブライブラリのスレッド問題です。おそらく描画コードが実行されていて、何かが壊れていた間に、タッチハンドラが別のスレッドから呼び出されたようです。

cthreadsユニットが問題を解決しました! http://forum.lazarus.freepascal.org/index.php?topic=17427.0

関連する問題