У меня есть некоторые функции C, которые я вызываю через JNI, которые получают указатель на структуру, и некоторые другие функции, которые будут выделять / освобождать указатель на структуру того же типа, так что это будет немного проще с моей оберткой. Удивительно, но документация JNI очень мало говорит о том, как работать со структурами C.
Мой заголовочный файл C выглядит так:
typedef struct _MyStruct {
float member;
} MyStruct;
MyStruct* createNewMyStruct();
void processData(int *data, int numObjects, MyStruct *arguments);
Соответствующий файл оболочки JNI C содержит:
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);
}
... и, наконец, соответствующий класс 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);
}
}
К сожалению, этот код вызывает сбой JVM сразу после нажатия createNewMyStruct()
. Я немного новичок в JNI и понятия не имею, в чем может быть проблема.
Редактировать : Я должен отметить, что код C очень ванильный C, хорошо протестирован и перенесен из рабочего проекта iPhone. Кроме того, этот проект использует платформу Android NDK, которая позволяет запускать собственный код C из проекта Android из JNI. Однако я не думаю, что это проблема исключительно NDK ... с моей стороны это похоже на ошибку установки / инициализации JNI.