关于创建SurfaceView并从中获取ANativeWindow的问题,我有一个疑问。
- 在以下哪些方法中使用
mSurfaceView = new SurfaceView(this);
是正确的呢?
onCreate()
onStart()
提问原因:据我所了解,当我们失去焦点时(其他东西覆盖整个屏幕),SurfaceView 将被销毁,因此每次获得焦点时(执行 onStart())我们都需要重新创建它。或者 SurfaceView 会保持休眠状态并可重复使用吗?
接下来,我想从上述 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");
}
}
如果有人能为我解决这个问题,我将非常感激。