0

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

那么请告诉我如何C在java中调用这个函数?我google了很长时间,但没有得到任何奖励。

像这样的代码, 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(?);
}

非常感谢,对不起我糟糕的英语:(

4

1 回答 1

0

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

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

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

(can't do a proper link, SO forbids IP addresses)

于 2013-01-28T11:01:11.067 回答