我正在用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类,但没有设法让它工作? 非常感谢:))
答案 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);
这样做可以吗?它有效,但我想知道这是否是一种正确的方法。