9

我有一个关于创建 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 中创建对表面的弱全局引用并在 onSurfaceChanged 中针对 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。

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

4

1 回答 1

0

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

于 2013-03-08T17:57:02.140 回答