ANativeWindow_Lock只运行三次,然后挂起

时间:2015-09-12 16:41:29

标签: java android multithreading android-ndk

我正在尝试在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正在做什么,所以我可以看到它被卡住的地方?

0 个答案:

没有答案