我正在尝试在Android中使用ANativeWindow进行绘制。
我的Java代码如下所示:它创建一个Surface View,将其添加到SurfaceHolder回调中,并使用实现的方法来调用c代码。
public class FrameworkActivity extends Activity implements SurfaceHolder.Callback{
private SurfaceView surfaceView;
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState)
surfaceView = new SurfaceView(this);
surfaceView.getHolder().addCallback(this);
setContentView(surfaceView);
}
@Override protected void onPause(){
super.onPause();
cOnPause();
}
public void surfaceDestroyed(SurfaceHolder holder) {
cReleaseSurface();
}
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
cSetSurface(holder.getSurface());
}
}
调用看起来像这样的c代码(虽然它有点缩写):cSetSurface获取一个ANativeWindow,它将它传递给setSurface,后者对其进行格式化,然后启动一个循环的绘图线程,直到调用onPause()。绘图功能锁定和解锁窗口。 “printLog”只是写入日志。
void cOnStart(){
running=1;
}
void cOnPause(){
running=0;
pthread_join(drawing,NULL);
printLog("Pausing...");
}
void cSetSurface(JNIEnv* env, jobject thiz, jobject surface){
ANativeWindow *thisWindow = ANativeWindow_fromSurface(env,surface);
setSurface(thisWindow);
}
void setSurface(ANativeWindow* window){
pthread_join(drawing,NULL);
thisWindow=window;
screenHeight=ANativeWindow_getHeight(thisWindow);
screenWidth=ANativeWindow_getWidth(thisWindow);
//3 is RGB888, 8 bits per color
ANativeWindow_setBuffersGeometry(thisWindow,screenWidth,screenHeight,3);
pthread_attr_t attr2;
pthread_attr_init(&attr2);
pthread_create(&drawing, &attr2, &onDrawFrame,NULL);
}
void cReleaseSurface(){
printLog("Releasing the window");
pthread_join(drawing,NULL);
ANativeWindow_release(thisWindow);
}
void onDrawFrame(){
while(running!=0){
printLog("Got the window");
if (running!=0 && ANativeWindow_lock(thisWindow,&buffer,NULL)==0){
printLog("Drawing");
ANativeWindow_unlockAndPost(thisWindow);
printLog("Unlocking and posting");
}
}
}
当我运行它时,它会正好循环三次;在第四个循环中,它“挂起”;它变得完全没有反应并停止记录任何东西。它在打印“获得窗口”之后总是挂起,并且永远不会打印到“绘图”。如果我注释掉“ANativeWindow_lock”行,那么它就不会挂起(它只会给出解锁未锁定窗口的错误)。所以我很确定问题是ANativeWindow_lock导致问题。我还猜测它会发生,因为程序的其他部分正在解除分配或以其他方式更改本机窗口,而ANativeWindow_lock仍在尝试访问它;这就是为什么我同时使用setSurface和cReleaseSurface,直到绘图线程完成。但问题仍然存在。
有谁知道为什么会遇到问题,或者我可以用什么资源深入研究ANativeWindow_lock正在做什么,所以我可以看到它被卡住的地方?