Tengo un byte[]
en Java que informe sobre su longitud que 256 bytes, que los que paso a una función nativa en C.problema de bytes que pasa [] a través de JNI a C en Android
Cuando traté de obtener los datos de cada este arreglo estaba completamente equivocado y cuando lo imprimí no coincidía con los datos que imprimí justo antes de pasarlo a C.
Intenté algunas formas de acceder a los datos incluyendo GetByteArrayRegion
y GetByteArrayElements
pero nada parece para darme los datos que espero.
Cuando estaba investigando esto traté de ver lo que JNI creía que la longitud de jbyteArray
era con - informaba la longitud como 1079142960, mucho más que los 256 bytes que esperaba. También el valor era diferente cada vez que la función se llama, por ejemplo, otra vez volvió GetArrayLength
1079145720.
Aquí está el código que estoy utilizando para acceder a la matriz:
JNIEXPORT jbyteArray function(JNIEnv* env, jbyteArray array) {
int length = (*env)->GetArrayLength(env, array);
jbyte data[256];
(*env)->GetByteArrayRegion(env, array, 0, 256, data);
//also tried
//jbyte *data = (jbyte*) (*env)->GetByteArrayElements(env, array, NULL);
}
Esto parece bastante sencillo así que No estoy realmente seguro de lo que está pasando. La matriz parece estar bien desde Java, pero se generó en C y se pasó de vuelta, así que supongo que algo puede haber salido mal que a Java no le importa sino que rompe la matriz cuando vuelve a C.
Aquí está el código Solía generar la matriz y devolverla a Java:
//there is some openSSL stuff here that sets up a pointer to an RSA struct called keys that is size bytes large
jbyteArray result = (*env)->NewByteArray(env, size);
(*env)->SetByteArrayRegion(env, result, 0, size, (jbyte*)keys;
¿E-cando algo?
Gracias
¿Cómo se ve el código de Java? –
no pasa nada interesante en Java Cojo la matriz de bytes de un objeto SharedPreferences y luego verifico los datos y la longitud que se ven bien y luego los paso a la función nativa –