将void **指针转换为等效的Java类型

时间:2013-04-15 14:55:42

标签: java pointers dll types

我正在用Java编写的程序加载一个C DLL。 我希望能够使用此声明调用DLL中的一个方法:

dll_function(const char* foo1, const char* foo2, const char* foo3, void** bar, size_t* bar2);

如何在Java中使用正确类型的参数调用此方法?我知道(理论上)如何调用它,但我想知道的是如何传递“void **”来自我的Java程序的“和”size_t *“?基本上,我想知道void 和size_t ***的“等效类型”在Java中是 ......

我找到了Pointer类,但没有设法让它工作? 非常感谢:))

3 个答案:

答案 0 :(得分:1)

size_t是一个整数,用于存储器中变量的大小;因此,在Java中使用unsigned long应该是安全的。

void*可能是指向未知类型对象的指针。 This question,在这个问题上非常有趣。在Java中Object通常在这种情况下使用,但我不知道如何在它们之间进行转换,尽管this question可能对此有帮助。

答案 1 :(得分:1)

几年前我在Java / JNI / C项目上工作,我们不得不在Java对象中维护不透明的C指针。我们在Java端使用long值来保存C指针,这些指针在JNI端从jlong转换为void*或我们需要的任何指针类型。

由于Java long类型是64位宽,而JNI / C指针通常是32位或64位宽,我们在它们之间进行转换没有任何问题。

答案 2 :(得分:0)

我尝试了你的解决方案,但我想我并没有真正理解正确... 但我用这个解决了我的问题:

import com.sun.jna.ptr.IntByReference;

我在Java程序中调用了C函数:

IntByReference myVoidPointerPointer = new IntByReference();
myCLibrary.myCFunction(myVoidPointerPointer);

C函数“myCFunction”如下所示:

void myCFunction(void** parameter);

这样做可以吗?它有效,但我想知道这是否是一种正确的方法。