2012-02-20 8 views
6

Tengo una pregunta sobre la creación de un SurfaceView y, posteriormente, obtener una ANativeWindow de la misma.SurfaceView y ANativeWindow

  1. ¿Es apropiado hacer

    mSurfaceView = new SurfaceView(this); en:

    • onCreate()
    • onStart()

razón por preguntar: según entiendo la SurfaceView conseguirá destruida cuando Perdemos el foco (algo más cubre t Toda la pantalla), por lo que necesitaremos volver a crearla cada vez que obtengamos el foco (se ejecuta onStart()). ¿O el SurfaceView permanece inactivo y reutilizable?

  1. Pasando a otro punto, ahora me gustaría crear una ventana nativa desde la superficie mencionada (en código nativo). ¿Es apropiado hacer

    ANativeWindow* newwindow = ANativeWindow_fromSurface(jniEnv, joSurface) en:

    • onSurfaceCreated_native(..., jobject surface)
    • onSurfaceChanged_native(..., jobject surface)

razón por preguntar: onSurfaceChanged parece estar llamado siempre después onSurfaceCreated por lo que tienen la opción de decidir cuándo crear la ventana nativa Por un lado, parece lógico hacer esto en onSurfaceCreated, ¡pero los dos jobject surface parecen estar haciendo referencia a objetos diferentes! (Como se comprobó mediante la creación de un débil ref mundial a la superficie en onSurfaceCreated y comprobar que en contra de ambos NULL y la superficie en onSurfaceChanged, véase el código de abajo)

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"); 
} 

}

Por lo tanto, si hay dos objetos de superficie distintos enviados a onSurfaceCreated y onSurfaceChanged, entonces queremos usar el más nuevo y no mantener una referencia de superficie obsoleta, y por lo tanto hacer ANativeWindow_from_Surface en onSurfaceChanged.

Realmente agradecería que alguien pudiera arrojar algo de luz sobre este tema para mí.

+0

¿Alguna vez resolvió esto? Intento compartir una superficie entre OpenGL y Java, ANativeWindow parece ser una de las pocas formas razonables de hacerlo – ephemer

Respuesta

0

¿Ha intentado usar android.view.Surface en lugar de android.view.SurfaceView?

Cuestiones relacionadas