SurfaceView의 생성과 그로부터 ANativeWindow를 가져 오는 것에 관한 질문이 있습니다. 질문에 대한
SurfaceView and ANativeWindow
onCreate()
onStart()
이유 :
- 는 적절한에서
mSurfaceView = new SurfaceView(this);
을 할 수있는 서피스 뷰 SurfaceView 때 파괴 얻을 것이다 나는 그것을 이해 우리는 초점을 잃는다. 전체 화면) 그래서 우리는 포커스를 얻을 때마다 다시 만들어야 할 것입니다 (onStart()가 실행됩니다). 아니면 SurfaceView가 휴면 상태로 있고 재사용 가능합니까?위로 이동 이제 위에서 언급 한 표면 (원시 코드로)에서 기본 윈도우를 만들고 싶습니다. 질문에 대한
onSurfaceCreated_native(..., jobject surface)
onSurfaceChanged_native(..., jobject surface)
이유 :이 적절한에서
ANativeWindow* newwindow = ANativeWindow_fromSurface(jniEnv, joSurface)
을 할 수 있나요 onSurfaceChanged는onSurfaceCreated
그래서 우리는에 관해서는 선택의 여지가 후 항상 호출 될 것으로 보인다 언제 네이티브 윈도우를 만들지. 한편으로는onSurfaceCreated
에서 논리적으로 보이지만 두 개의jobject surface
은 다른 객체를 참조하는 것으로 보입니다! (onSurfaceCreated의 표면에 약 글로벌 (REF)를 생성하고 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를 수행하려고합니다.
누군가가 나를 위해이 문제에 대해 밝힐 수 있다면 정말 고마워 할 것입니다.
혹시 이것을 알아 냈습니까? 저는 OpenGL과 Java 사이의 표면을 공유하려고 노력하고 있습니다. ANativeWindow는이 작업을 수행하는 유일한 합리적인 방법 중 하나 인 것 같습니다. – ephemer