Obtener un ANativeWindowBuffer de ANativeWindow_Buffer

Para obtener acceso rápido a píxeles de textura de OpenGL ES 2.0 en Android NDK, quiero usar la extensión eglCreateImageKHR() .

De acuerdo con la documentación EGL_NATIVE_BUFFER_ANDROID :

Esta extensión permite usar un búfer de ventana de Android (struct ANativeWindowBuffer ) como una fuente EGLImage .

ANativeWindowBuffer es una struct interna utilizada por las clases de framework nativas como GraphicBuffer . Desafortunadamente, ya que estoy en NDK no tengo acceso directo a estas clases.

El NDK native_window interfaz me permite pasar un objeto de Surface Java a través de la NDK. Puedo entonces utilizar ANativeWindow_fromSurface() para conseguir una manija ANativeWindow* opaca. Con este puntero puedo llamar ANativeWindow_lock() para rellenar una estructura del tipo ANativeWindow_Buffer ( ANativeWindow_Buffer el _ ).

Si intento utilizar este &ANativeWindow_Buffer objeto con eglCreateImageKHR() falla con EGL_BAD_NATIVE_WINDOW .

Mi pregunta es: ¿Cómo puedo utilizar ANativeWindow_Buffer con eglCreateImageKHR() o, alternativamente, cómo obtener un ANativeWindowBuffer de ANativeWindow_Buffer o de ANativeWindow* .

De lo que descubrí al pasar por este camino, ANativeWindow_Buffer y ANativeWindowBuffer son tipos completamente diferentes. Bueno, son algo similares, pero definitivamente tan diferentes que no se pueden usar de forma intercambiable.

Si desea comparar, aquí están las definiciones:

Usted notará que tienen algunos campos en común ( width , height , stride , format ). La gran diferencia es que ANativeWindow_Buffer contiene un puntero a los datos reales, mientras que ANativeWindowBuffer contiene un identificador opaco del tipo buffer_handle_t .

Así que si usted descubrió cómo obtener un ANativeWindow_Buffer , y esperaba que usted estaba bien en su camino a un ANativeWindowBuffer , usted es … probablemente no. Al menos esa fue mi conclusión. Creo que los nombres muy similares son sólo una broma.

No encontré una manera de crear un ANativeWindowBuffer del código NDK. Al menos con el uso de sólo APIs compatibles, creo que no es posible. Mi investigación fue con KitKat.

  • Cómo utilizar el archivo existente .so en la aplicación android
  • Android: Calling System.loadLibrary () hace que el proceso muera
  • Cómo depurar código nativo en un proyecto de biblioteca de Android?
  • ¿Cómo crear una biblioteca nativa de C ++ en Android?
  • Cómo utilizar bibliotecas extra * .so en Android Studio y NDK
  • Android ndk jni Ninguna implementación encontrada error
  • Firma digital de una biblioteca compartida en Android
  • Android JNI: GetObjectClass se bloquea con SIGSEGV (no es una referencia JNI válida)
  • ¿Cómo realizar llamadas JNI desde un servicio incluso si la aplicación está cerrada?
  • ¿Cuáles son las consecuencias si intentamos conectar un hilo nativo permanentemente a la DVM (JVM)?
  • JNI Warnig tipo de retorno esperado 'L' calling LocationManager.requestLocationUpdates
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.