У меня есть некоторые функции 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 с моей стороны.