我有一些通过JNI调用的C函数,这些函数使用指向一个 struct 的指针,还有一些其他函数将分配/释放指向同一类型 struct 的指针,这样处理包装器就更容易了.令人惊讶的是,JNI文档很少涉及如何处理C struct .
我的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);
}
}
不幸的是,此代码在达到createNewMyStruct()
后立即使JVM崩溃.我对JNI还是个新手,不知道会有什么问题.
Edit:我应该注意到,C代码是非常普通的C,经过良好测试,并且是从一个正在工作的iPhone项目移植而来的.此外,该项目使用的是Android NDK框架,它允许您从JNI内的Android项目运行原生C代码.然而,我不认为这是严格意义上的NDK问题...这似乎是我的JNI设置/初始化错误.