如何在JNI中在C结构和Java代码之间传递数据?

15 浏览
0 Comments

如何在JNI中在C结构和Java代码之间传递数据?

我有一些通过JNI调用的C函数,它们接受一个指向结构体的指针,还有一些函数将分配/释放指向相同类型结构体的指针,以便更容易处理我的包装器。令人惊讶的是,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);

}

}

不幸的是,这段代码在调用createNewMyStruct()后立即导致JVM崩溃。我对JNI还不太熟悉,不知道问题可能是什么。

编辑:我应该注意到C代码是非常基本的C,经过了充分的测试,并且是从一个工作的iPhone项目移植过来的。此外,该项目使用了Android NDK框架,可以在JNI中从Android项目中运行本机C代码。然而,我不认为这严格来说是一个NDK问题...似乎是我设置/初始化JNI时出错了。

0