gpt4 book ai didi

java - NativeLongByReference 在 x64 操作系统上仅包含 32 位数字

转载 作者:行者123 更新时间:2023-12-02 01:11:16 27 4
gpt4 key购买 nike

我在引用 typedef unsigned __int64 EntityNumber; 输入参数时遇到函数问题。

库是 x64,操作系统是 Windows 10。

如果我通过NativeLongByReference,输出缓冲区只有4个字节,所以如果超过32位,我的数字就会损坏。我用dump检查了一下,确实包含了一半的64位Long

如果我通过了DoubleByReference,我可以通过doubleByReference.pointer.getLong(0)获得我的Long。

虽然这个 hack 有效,但我想知道,如果两个操作系统都是 64 位,Long 会有什么问题?

long TRANS2QUIK_API __stdcall TRANS2QUIK_SEND_SYNC_TRANSACTION (LPSTR lpstTransactionString, long* pnReplyCode, PDWORD pdwTransId, EntityNumber* pnOrderNum, LPSTR lpstrResultMessage, DWORD dwResultMessageSize, long* pnExtendedErrorCode, LPSTR lpstErrorMessage, DWORD dwErrorMessageSize);

和JNA接口(interface)

    NativeLong TRANS2QUIK_SEND_SYNC_TRANSACTION(
String lpstTransactionString,
NativeLongByReference pnReplyCode,
NativeLongByReference pdwTransId,
DoubleByReference pdOrderNum, <- hack!
byte[] lpstrResultMessage,
int dwResultMessageSize,
NativeLongByReference pnExtendedErrorCode,
byte[] lpstrErrorMessage,
int dwErrorMessageSize
);

openjdk version "11.0.4" 2019-07-16
OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.4+11)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.4+11, mixed mode)

最佳答案

在 Windows 上,a long is a 32-bit integer ,无论操作系统位数如何。

因此,NativeLong 在 Windows 上将指向 32 位 long 值,并且没有必要在 Windows 代码中使用。 NativeLong 类型更适用于 *nix 操作系统。

您可以在 JNA 源代码中看到这一点,其中 NativeLong 的大小在 Native.java 中定义。其中 LONG_SIZE 派生自 long 类型的 native sizeof() 函数,a 32-bit integer .

在 Windows 上改变大小的类型是 Pointer 类型。事实上,指向 NativeLongByReference 的指针在各自的系统上是 32/64 位,而指向的值是 32 位。

在您的情况下,您的变量被明确定义为 64 位整数,因此 LongByReference 将是正确的映射。

关于java - NativeLongByReference 在 x64 操作系统上仅包含 32 位数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59364191/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com