我有关于SurfaceView的创作,随后从它得到一个ANativeWindow的问题。
原因问:据我了解,当我们失去焦点(别的东西覆盖整个屏幕),所以我们需要将我们每次获得焦点时重新创建它(在onStart()被执行)的SurfaceView将被摧毁。抑或是SurfaceView保持休眠状态,可重复使用?
mSurfaceView = new SurfaceView(this);
在:
onCreate()
onStart()
原因问:onSurfaceChanged似乎总是被调用后ANativeWindow* newwindow = ANativeWindow_fromSurface(jniEnv, joSurface)
所以我们有一个选择何时创建本机窗口。一方面,它似乎顺理成章的事情这onSurfaceCreated_native(..., jobject surface)
,但两个onSurfaceChanged_native(..., jobject surface)
似乎被引用不同的对象! (正如通过创建一个弱全局REF在onSurfaceCreated表面和检查它针对两个NULL和表面在onSurfaceChanged检查,请参阅下面的代码)
onSurfaceCreated
onSurfaceCreated
jobject surface
onSurfaceCreated_native(JNIEnv env, ... ,jobject surface) {
myWeakObjectGlobal = env->NewWeakGlobalRef(surface);
}
因此,如果确有被送进onSurfaceCreated和onSurfaceChanged两个不同表面的对象,那么我们想用最新鲜的一个,而不是挂在一个陈旧的表面参考,啥都ANativeWindow_from_Surface在onSurfaceChanged。
我真的很感激,如果有人可以在这个问题上大放异彩一些轻我。
你是否尝试过使用,而不是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");
}
?