SurfaceViewの作成とその後のANativeWindowの取得に関する質問があります。SurfaceViewとANativeWindow
- に
mSurfaceView = new SurfaceView(this);
を行うには、それが適切である:
の提示のための
onCreate()
onStart()
理由:私はそれを理解するようSurfaceViewが破壊されてしまいます私たちは焦点を失います(何か他のものを覆います彼は画面全体)、私たちがフォーカスを得るたびにそれを再作成する必要があります(onStart()が実行されます)。あるいは、SurfaceViewは休眠状態で再利用可能ですか?
ここでは、上記のサーフェス(ネイティブコード)からネイティブウィンドウを作成したいと思います。尋ねるため
onSurfaceCreated_native(..., jobject surface)
onSurfaceChanged_native(..., jobject surface)
理由
:onSurfaceChangedは常にonSurfaceCreated
後に呼び出されるようですので、我々はへと選択肢を持っているにANativeWindow* newwindow = ANativeWindow_fromSurface(jniEnv, joSurface)
を行うには、それが適切ですいつネイティブウィンドウを作成するか。一方ではonSurfaceCreated
でこれを行うのが論理的ですが、2つの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");
}
}
したがって、実際には2つの異なるサーフェスオブジェクトがonSurfaceCreatedおよびonSurfaceChangedに送信されている場合は、最新のものを使用して古いサーフェス参照にハングしないようにし、その結果onSurfaceChangedでANativeWindow_from_Surfaceを実行します。
誰かが私のためにこの問題についていくつかの光を照らすことができれば、本当に感謝しています。
あなたはこれを理解しましたか?私はOpenGLとJavaの間の表面を共有しようとしていますが、ANativeWindowはこれを行う唯一の合理的な方法の1つと思われます – ephemer