2012-02-20 2 views
6

SurfaceView의 생성과 그로부터 ANativeWindow를 가져 오는 것에 관한 질문이 있습니다. 질문에 대한

SurfaceView and ANativeWindow

  • onCreate()
  • onStart()

이유 :

  1. 는 적절한에서

    mSurfaceView = new SurfaceView(this);을 할 수있는 서피스 뷰 SurfaceView 때 파괴 얻을 것이다 나는 그것을 이해 우리는 초점을 잃는다. 전체 화면) 그래서 우리는 포커스를 얻을 때마다 다시 만들어야 할 것입니다 (onStart()가 실행됩니다). 아니면 SurfaceView가 휴면 상태로 있고 재사용 가능합니까?

    1. 위로 이동 이제 위에서 언급 한 표면 (원시 코드로)에서 기본 윈도우를 만들고 싶습니다. 질문에 대한

      • 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를 수행하려고합니다.

    누군가가 나를 위해이 문제에 대해 밝힐 수 있다면 정말 고마워 할 것입니다.

+0

혹시 이것을 알아 냈습니까? 저는 OpenGL과 Java 사이의 표면을 공유하려고 노력하고 있습니다. ANativeWindow는이 작업을 수행하는 유일한 합리적인 방법 중 하나 인 것 같습니다. – ephemer

답변

0

android.view.SurfaceView 대신 android.view.Surface을 사용해 보셨습니까?