2017-03-09 2 views
0

Application se bloque sans erreurs après avoir transmis quelques événements tactiles au code natif (ARM). Cela se produit UNIQUEMENT si le gestionnaire natif écrit un message dans le journal système et UNIQUEMENT s'il est appelé à partir de GLSurfaceView.onTouchEvent(). Crash se produit pas immédiatement, mais après les appels 2..10, et ne semble pas à l'intérieur du code natif. Bien que si je supprime LogI (...) dans le code natif - cela fonctionne. Mais si j'appelle la même fonction native d'un autre endroit (par exemple, onDrawFrame()) - cela fonctionne sans crash.Android: le processus est mort après l'appel du gestionnaire natif tactile

Cela se produit à la fois dans Android Emulator (ARM) et sur un périphérique réel.

Voici mon code Java:

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

code natif (Pascal):

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 

Il n'y a pas de traces de pile ou décharges dans le journal . Existe-t-il un moyen de connaître la raison exacte de la fin de l'application?

Répondre

0

Semble que c'est un problème de threading avec ma bibliothèque native. Le gestionnaire tactile a été appelé à partir d'un autre thread probablement pendant que le code de dessin est en cours d'exécution, et quelque chose a été endommagé.

L'ajout de cthreads a permis de résoudre le problème! http://forum.lazarus.freepascal.org/index.php?topic=17427.0