将少量触摸事件传递给本机代码(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
日志中没有任何堆栈跟踪或转储。有没有办法找出申请终止的确切原因?
答案 0 :(得分:0)
似乎它是我的本机库的线程问题。
,当绘图代码正在运行时,可能是从另一个线程调用了Touch处理程序添加 cthreads 单元解决了这个问题! http://forum.lazarus.freepascal.org/index.php?topic=17427.0