7

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

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

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

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

4

3 回答 3

2

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

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

于 2013-04-15T20:40:34.063 回答
1

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

void*很可能是一个指向未知类型对象的指针。这个问题,在这件事上很有趣。在这种情况下通常使用 Java Object,但我不知道您将如何在它们之间进行转换,尽管这个问题可能会有所帮助。

于 2013-04-15T15:26:33.533 回答
0

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

import com.sun.jna.ptr.IntByReference;

我在我的 Java 程序中这样调用 C 函数:

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

C 函数“myCFunction”如下所示:

void myCFunction(void** parameter);

这样做可以吗?它正在工作,但我想知道这是否是正确的方法。

于 2013-04-16T12:01:59.303 回答