当我想在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(?);
}
非常感谢并为我可怜的英语道歉:(
答案 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地址)