Tengo una pregunta sobre la creación de un SurfaceView y, posteriormente, obtener una ANativeWindow de la misma.SurfaceView y ANativeWindow
- ¿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?
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í.
¿Alguna vez resolvió esto? Intento compartir una superficie entre OpenGL y Java, ANativeWindow parece ser una de las pocas formas razonables de hacerlo – ephemer