SurfaceView and ANativeWindow



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

  1. 在中执行

    mSurfaceView = new SurfaceView(this);是否合适
    • onCreate()
    • onStart()

问的原因:据我所知,当我们失去焦点时,SurfaceView会被破坏(其他东西会覆盖整个屏幕),所以我们每次获得焦点时都需要重新创建它(执行onStart())。还是SurfaceView保持休眠状态并可重复使用?

  1. 接下来,我想从上面提到的表面(在本机代码中)创建一个本机窗口。在:
    中执行

    ANativeWindow* newwindow = ANativeWindow_fromSurface(jniEnv, joSurface)是否合适

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

询问原因:onSurfaceChanged似乎总是在onSurfaceCreated之后调用,因此我们可以选择何时创建本机窗口。一方面,在onSurfaceCreated中这样做似乎是合乎逻辑的,但两个jobject surface似乎引用了不同的对象!(通过在onSurfaceCreated中创建一个对曲面的弱全局引用并在onSuraceChanged中对NULL和曲面进行检查来进行检查,请参见下面的代码)

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。

如果有人能为我澄清这个问题,我将不胜感激。

您是否尝试过使用android.view.Surface而不是android.view.SurfaceView

最新更新