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:

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; ?

  1. Puede utilizar GetArrayLength(JNIEnv* env, jbyteArray array) Lea aquí .

  2. No estoy seguro de lo que quieres hacer, supongo que quieres el contenido de jpSeed en bd.data[1] . De todos modos, acceder al contenido de una matriz de bytes, debe hacerse con GetByteArrayElements(...).

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.

  • Java: Tamaño de un vector en bytes
  • La barra de estado de Android espera iconos de tamaño 25x25dp mientras que las pautas recomiendan 32x32dp. ¿Quién está equivocado?
  • Tamaño de pantalla Honeycomb Menu android
  • Android: cómo aumentar el tamaño de montón en tiempo de ejecución?
  • Ancho de notificación de Android
  • ¿Cómo hacer varias vistas del mismo ancho?
  • ¿Qué teléfonos Android tienen tamaños de pantalla grande
  • Cómo especificar el tamaño del icono en el Marcador en Google Maps V2 Android
  • ¿Cómo calcula Android el caché y el tamaño de los datos?
  • ImageView ser un cuadrado con ancho dinámico?
  • No se encontró ningún identificador de recursos para XLargeScreens
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.