JNI: Cómo obtener el tamaño jbyteArray
Fondo
Estoy trabajando con arrays de bytes en JNI . Y no puedo conseguir la longitud de jbyteArray . Estoy escribiendo código en eclipse en Windows 7 .
Código Java:
- Definiciones de calificadores de múltiples pantallas de Android
- La barra de estado de Android espera iconos de tamaño 25x25dp mientras que las pautas recomiendan 32x32dp. ¿Quién está equivocado?
- Java (Android) Insertar icono en lienzo
- ¿Cómo obtengo la altura de la pantalla en Android?
- Reduzca el tamaño de APK de depuración en IntelliJ
private native int Enroll( byte[] pSeed );
Código JNI:
En JNI tengo una estructura que tiene dos miembros unsigned long length
y unsigned char data[1]
typedef struct blobData_s { unsigned long length; unsigned char data[1]; } blobData_t;
Ahora como mi función JNI obtener como argumento jbyteArray jpSeed
quiero obtener la longitud de jpSeed
y establecerlo como miembro de longitud de struct.
JNIEXPORT jint JNICALL Java_com_Test_Enroll( JNIEnv* env, jobject thiz, jbyteArray jpSeed ){ blobData_t* bd = malloc( sizeof(blobData_t) ); bd->length = **Question 1** bd->data[1] = jbyteArray; }
Pregunta 1: ¿Cómo puedo obtener la longitud de jpSeed
en JNI?
Pregunta 2: ¿Funciona este código correctamente bd.data[1] = jbyteArray;
?
- ¿Cómo hacer varias vistas del mismo ancho?
- ¿Cómo puedo obtener el tamaño de una carpeta en una tarjeta SD en Android?
- Icono de la aplicación en el dispositivo es demasiado pequeño
- Obtener altura real de la vista
- Cómo hacer que EditText no cambie su tamaño automáticamente
- Android tamaño de la barra de clasificación (no puede utilizar Widget.RatingBar.Small)
- ¿Cómo comprobar un dispositivo Android es HDPI pantalla o pantalla MDPI?
- Tamaño físico de la fuente en puntos en Android
-
Puede utilizar
GetArrayLength(JNIEnv* env, jbyteArray array)
Lea aquí . -
No estoy seguro de lo que quieres hacer, supongo que quieres el contenido de
jpSeed
enbd.data[1]
. De todos modos, acceder al contenido de una matriz de bytes, debe hacerse conGetByteArrayElements(...).
Solución
Respuesta a la pregunta 1. Como jpSeed
es jbyteArray
significa que puede obtener su longitud llamando a GetByteArrayElements( ... )
funciones que declaró en JNI (puede leer la documentación aquí ) aquí el código correcto será:
JNIEXPORT jint JNICALL Java_com_Test_Enroll( JNIEnv* env, jobject thiz, jbyteArray jpSeed ){ blobData_t* bd = malloc( sizeof(blobData_t) ); bd->length = (*env)->GetArrayLength( env, jpSeed ); ....... }
Respuesta a la pregunta 2. Este bd->data[1] = jbyteArray;
Código no es correcto ya que no se compilará la solución correcta para esta parte es:
JNIEXPORT jint JNICALL Java_com_Test_Enroll( JNIEnv* env, jobject thiz, jbyteArray jpSeed ){ blobData_t* bd = malloc( sizeof(blobData_t) ); ....... jbyte* bytes = (*env)->GetByteArrayElements( env, jpSeed, 0 ); bd->data[1] = bytes[1]; }
Y no te olvides de liberar.