SurfaceView和ANativeWindow

9

关于创建SurfaceView并从中获取ANativeWindow的问题,我有一个疑问。

  1. 在以下哪些方法中使用

    mSurfaceView = new SurfaceView(this); 是正确的呢?

    • onCreate()
    • onStart()

提问原因:据我所了解,当我们失去焦点时(其他东西覆盖整个屏幕),SurfaceView 将被销毁,因此每次获得焦点时(执行 onStart())我们都需要重新创建它。或者 SurfaceView 会保持休眠状态并可重复使用吗?

  1. 接下来,我想从上述 Surface 中创建本地窗口(在本地代码中)。在以下哪些方法中使用

    ANativeWindow* newwindow = ANativeWindow_fromSurface(jniEnv, joSurface) 是正确的呢?

    • onSurfaceCreated_native(..., jobject surface)
    • onSurfaceChanged_native(..., jobject surface)

提问原因:无论何时调用 onSurfaceChanged,它似乎总是在 onSurfaceCreated 后调用,因此我们可以选择何时创建本地窗口。一方面,将其放在 onSurfaceCreated 中似乎很合理,但是两个 jobject surface 似乎引用不同的对象!(通过在 onSurfaceCreated 中创建一项弱全局引用并在 onSurfaceChanged 中将其与 NULL 和 surface 进行比较来检查,如下所示)

onSurfaceCreated_native(JNIEnv env, ... ,jobject surface) {
myWeakObjectGlobal = env->NewWeakGlobalRef(surface);
}

onSurfaceChanged_native(JNIEnv env, ... ,jobject surface) {

if (env->IsSameObject(surface, myWeakObjectGlobal)) {
    LOGW("onSurfaceChanged_native: new surface is SAME as old surface");
} else {
    LOGW("onSurfaceChanged_native: new surface is DIFFERENT as old surface");
}

if (env->IsSameObject(NULL, myWeakObjectGlobal)) {
    LOGW("    furthermore, old surface is NULL");
} else {
    LOGW("    furthermore, old surface is NOT null");
}

}

因此,如果确实存在两个不同的表面对象被发送到onSurfaceCreated和onSurfaceChanged中,则我们希望使用最新的表面对象,而不是保留旧的表面引用,并且在onSurfaceChanged中进行ANativeWindow_from_Surface操作。
如果有人能为我解决这个问题,我将非常感激。

你最终解决了这个问题吗?我正在尝试在OpenGL和Java之间共享一个表面,ANativeWindow似乎是唯一合理的方法之一。 - ephemer
1个回答

0
你尝试过使用android.view.Surface而不是android.view.SurfaceView吗?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接