Java JNA u32t 指针(内存)的返回值

标签 java pointers jna

我尝试使用 JNA 访问 C++ DLL 的方法。

定义如下:

u32t OpenPort(u8t valueA, char* valueB, u32t* handle);

我不确定如何映射 u32t 以及如何使用指针或内存获取 returnValue?

我是这样做的:

int OpenPort(byte valueA, String valueB, IntByReference handle); //u32t OpenPort(u8t type, char* myString, u32t* handle);

并调用

        IntByReference handle = new IntByReference();            
        byte i = 0;
        int error = myClass.OpenPort(i, "my string", handle);
        System.out.println(error  + " - " + handle.getValue());

结果是“0 - 0”。

错误“0”很好,但 returnValue 不应该为 0。因为这是我需要传递给其他方法的值,例如:

int ClosePort(IntByReference handle); //u32t ClosePort(u32t handle);

如果我然后开始:

error = myClass.ClosePort(handle);

返回错误表明端口句柄无效。

来自 DLL 制造商的示例 C# 代码如下:

UInt32 handle;
UInt32 error;
error= OpenPort(0, "teststring", out handle);
xError = ClosePort(handle);

最佳答案

欢迎来到 StackOverflow。

指针实际上指向有32位值的 native 内存。但是仅映射到 Pointer 并不能告诉您所指向的位置有什么。

您应该使用 IntByReference 类来建模 *uint32_t 或类似的指向 32 位值的指针。该方法将返回一个指针,但您可以使用 getValue() 方法来检索您想要的实际值。

我还注意到您使用了 NativeLong 作为返回类型,但它被明确指定为 32 位,因此您希望使用 int。仅在 long 定义为 32 位或 64 位(具体取决于操作系统位数)的情况下才使用 NativeLong

请注意,Java 没有有符号整数与无符号整数的概念。虽然该值是 32 位 int,但您需要通过将负值转换为无符号对应项来处理您自己的代码中的负值。

所以你的映射应该是:

int MethodName(byte valueA, String valueB, IntByReference returnValue);

然后调用:

IntByReference returnValue = new IntByReference();
MethodName(valueA, ValueB, returnValue);
int theU32tValue = returnValue.getValue();

关于Java JNA u32t 指针(内存)的返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58035304/

相关文章:

java - 将数据从 C 服务器代码发送到 java 客户端代码

java - Python 相当于 Java 的 getClass().getFields()

java - 在 JNA 中使用 TCHAR 缓冲区

c - 为 Blackberry 应用程序将 C 库移植到 Java

java - 如何在preparedstatement中使用JDBC通配符创建mysql表

java - 我想从文本文件添加值并将其添加到二维java中。但给出空指针异常

python - 我可以获得在 Python 2.7 中引用其他变量的列表吗?

c - 当我有一个指向结构的指针时,为什么我必须使用 malloc?

c - 指针 - 困惑

java - 为什么我的 libVLC 程序在尝试绑定(bind)捕获设备时会死锁?