Android:进程在调用本机触摸处理程序后死亡

时间:2017-03-09 08:11:38

标签: java android android-ndk native freepascal

将少量触摸事件传递给本机代码(ARM)后,应用程序崩溃且没有错误。仅当本机处理程序将消息写入系统日志时才会发生这种情况,并且仅在从GLSurfaceView.onTouchEvent()调用它时才会发生。崩溃不是立即发生,而是在2..10次调用之后,并且似乎不在本机代码中。虽然如果我删除本机代码中的LogI(...) - 它可以工作。但是如果我从另一个地方调用相同的本机函数(例如,从onDrawFrame()) - 它没有崩溃。

在Android模拟器(ARM)和真实设备中都会发生这种情况。

这是我的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);

原生代码(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 android.os.BinderProxy@ae0ea220 does not exist

日志中没有任何堆栈跟踪或转储。有没有办法找出申请终止的确切原因?

1 个答案:

答案 0 :(得分:0)

似乎它是我的本机库的线程问题。

,当绘图代码正在运行时,可能是从另一个线程调用了Touch处理程序

添加 cthreads 单元解决了这个问题! http://forum.lazarus.freepascal.org/index.php?topic=17427.0