我应该在java中使用哪种类型来使用JNI调用此C函数?

时间:2013-01-28 10:35:08

标签: android pointers struct java-native-interface malloc

当我想在android使用C的java中调用本机JNI函数时,我遇到了这个问题。我将指向结构的指针作为C函数中的参数传递,并为该指针分配内存。

那么请告诉我如何在java中调用此C函数?我用谷歌搜索了很长时间但没有获得任何奖励。

这样的代码,A是结构的名称:

JNIEXPORT int JNICALL
Java_pkgname_NativeTools_create(JNIEnv *env, jclass jclazz, A **ptr) {
    *ptr = (A*) malloc(sizeof(A));
    if (*ptr != NULL ) {
        return 0;
    } else {
        return -1;
    }
}

我不知道如何编写本机接口:

public class NativeTools{
    static {
        System.loadLibrary("LibName");
    }

    // TODO don't know what type in JNI should I use to declare this native function?
    public static native int create(?);
}

非常感谢并为我可怜的英语道歉:(

1 个答案:

答案 0 :(得分:0)

你不能这样做。您只能使用JNI datatypes作为C函数参数。无论如何,Java中没有像 structs 甚至指针这样的东西。是什么,你想在Java端创建然后“传递给C”?您可以获得的最接近指针的是引用类型jobject,但C并不像您尝试的那样理解它。它是对 JVM对象的引用,而不是 C struct 。它仅作为进一步JNI调用的参数(调用JVM)。

有些工具可以帮助您改进数据类型的互操作性(SWIG,JNA),但鉴于明显的基本误解,您应该从一些基本的阅读开始:

http://192.9.162.55/docs/books/jni/html/jniTOC.html

(无法做正确的链接,SO禁止IP地址)