如何在JNI中来回传递C结构到Java代码?
我有一些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崩溃。我对JNI有点陌生,不知道问题可能是什么。createNewMyStruct()
编辑:我应该注意的是,C代码非常普通C,经过了充分的测试,并且是从一个工作的iPhone项目中移植过来的。此外,此项目还使用 Android NDK 框架,该框架允许您从 JNI 中运行 Android 项目中的本机 C 代码。但是,我不认为这完全是NDK问题...这似乎是我的JNI设置/初始化错误。