gpt4 book ai didi

java - 如何在 JNI 中将 C 结构来回传递给 Java 代码?

转载 作者:IT老高 更新时间:2023-10-28 13:53:47 24 4
gpt4 key购买 nike

我有一些通过 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 项目运行 native C 代码。但是,我不认为这严格来说是一个 NDK 问题……这似乎是我的 JNI 设置/初始化错误。

最佳答案

您需要创建一个与 C 结构具有相同成员的 Java 类,并通过方法 env->GetIntField、env->SetIntField、env->GetFloatField、env->SetFloatField 和等等 - 简而言之,大量的体力劳动,希望已经存在自动执行此操作的程序:JNAerator (http://code.google.com/p/jnaerator) 和 SWIG (http://www.swig.org/)。两者各有优劣,选择权在你。

关于java - 如何在 JNI 中将 C 结构来回传递给 Java 代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3923299/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com