Tengo algunas funciones C que estoy llamando a través de JNI que toman un puntero a una estructura, y algunas otras funciones que asignará/liberar un puntero al mismo tipo de estructura para que sea un poco más fácil de tratar mi envoltorio Sorprendentemente, la documentación de JNI dice muy poco sobre cómo lidiar con las estructuras de C.¿Cómo pasar estructuras C de ida y vuelta al código de Java en JNI?
Mi archivo de cabecera C se ve así:
typedef struct _MyStruct {
float member;
} MyStruct;
MyStruct* createNewMyStruct();
void processData(int *data, int numObjects, MyStruct *arguments);
El archivo de envoltura JNI C correspondiente contiene:
JNIEXPORT jobject JNICALL
Java_com_myorg_MyJavaClass_createNewMyStruct(JNIEnv *env, jobject this) {
return createNewMyStruct();
}
JNIEXPORT void JNICALL
Java_com_myorg_MyJavaClass_processData(JNIEnv *env, jobject this, jintArray data,
jint numObjects, jobject arguments) {
int *actualData = (*env)->GetIntArrayElements(env, data, NULL);
processData(actualData, numObjects, arguments);
(*env)->ReleaseIntArrayElements(env, data, actualData, NULL);
}
... y, finalmente, la correspondiente clase Java:
public class MyJavaClass {
static { System.loadLibrary("MyJniLibrary"); }
private native MyStruct createNewMyStruct();
private native void processData(int[] data, int numObjects, MyStruct arguments);
private class MyStruct {
float member;
}
public void test() {
MyStruct foo = createNewMyStruct();
foo.member = 3.14159f;
int[] testData = new int[10];
processData(testData, 10, foo);
}
}
Desafortunadamente, este código bloquea la JVM justo después de presionar createNewMyStruct()
. Soy un poco nuevo para JNI y no tengo idea de cuál podría ser el problema.
Editar: Debo señalar que el código C es muy vainilla C, está bien probado y fue portado desde un proyecto de iPhone en funcionamiento. Además, este proyecto utiliza el marco Android NDK, que le permite ejecutar código C nativo desde un proyecto de Android desde JNI. Sin embargo, no creo que esto sea estrictamente un problema de NDK ... parece un error de configuración/inicialización de JNI por mi parte.
¿Algo más específico sobre el error? Cualquier mensaje de error? –
No, solo bloquea el JRE. Esa es una trampa sobre tratar con JNI ... –
La característica CheckJNI se agregó para encontrar errores de código comunes antes de que se conviertan en Heisenbugs. Está habilitado por defecto en el emulador. Consulte los jni-tips y los documentos embedded-vm-control en http://android.git.kernel.org/?p=platform/dalvik.git;a=tree;f=docs;h=b0d3023109f548626cce1a9a586c95e82fb012ac;hb=HEAD para información sobre cómo habilitarlo en un dispositivo. – fadden