Tengo un proyecto de Android (dirigido a Android 1.6 y superior) que incluye código nativo escrito en C/C++, al que se accede a través de NDK. Me pregunto cuál es la forma más eficiente de pasar una matriz de bytes desde Java a través de NDK a mi capa de pegamento JNI. Mi preocupación es si NDK para Android copiará o no la matriz de bytes, o simplemente me dará una referencia directa. Necesito acceso de solo lectura a los bytes en el nivel C++, por lo que cualquier copia detrás de escena sería una pérdida de tiempo desde mi perspectiva.Android: forma más eficiente de pasar algunos bytes de solo lectura a C++ nativo
Es fácil encontrar información sobre esto en la web, pero no estoy seguro de cuál es la información más pertinente. Ejemplos:
Get the pointer of a Java ByteBuffer though JNI
http://www.milk.com/kodebase/dalvik-docs-mirror/docs/jni-tips.html
http://elliotth.blogspot.com/2007/03/optimizing-jni-array-access.html
Así que ¿alguien sabe cuál es la mejor manera (más eficiente, menos copiado) de hacer esto en la corriente NDK? GetByteArrayRegion? GetByteArrayElements? ¿Algo más?
¿Existe alguna API eficiente similar para hacer lo contrario? - pasar 'unsigned char *' desde la capa nativa a la capa Java como 'byte []' o 'byteBuffer' –
Ambos ByteBuffer directo y byte [] se pueden usar para lectura/escritura desde/hacia el lado nativo. Puede usar la función de memoria de C para leer/copiar, una vez que haya llamado env-> GetDirectBufferAddress (buffer) o env-> Get ArrayElements (array, ...). PERO Direct ByteBuffer es mucho más rápido, no reproduce copias, es más seguro, etc., etc. –