Come passare C structs avanti e indietro al codice Java in JNI?

Ho alcune funzioni C che sto chiamando attraverso JNI che prendono un puntatore a una struttura e altre funzioni che assegnano / liberano un puntatore allo stesso tipo di struttura in modo che sia un po ‘più facile da gestire con il mio wrapper . Sorprendentemente, la documentazione JNI dice molto poco su come gestire le strutture C.

Il mio file di intestazione C si presenta così:

typedef struct _MyStruct { float member; } MyStruct; MyStruct* createNewMyStruct(); void processData(int *data, int numObjects, MyStruct *arguments); 

Il file wrapper JNI C corrispondente 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); } 

… e infine, la corrispondente class 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); } } 

Sfortunatamente, questo codice blocca la JVM subito dopo aver colpito createNewMyStruct() . Sono un po ‘nuovo per JNI e non ho idea di quale potrebbe essere il problema.

Edit : Devo notare che il codice C è molto vanigliato C, è ben testato ed è stato convertito da un progetto iPhone funzionante. Inoltre, questo progetto utilizza il framework NDK di Android, che consente di eseguire codice C nativo da un progetto Android all’interno di JNI. Tuttavia, non penso che questo sia un problema di tipo NDK … sembra un errore di inizializzazione / installazione JNI da parte mia.