gpt4 book ai didi

java - 当 sizeof(long) 为 4 时,为什么需要为 JNA 指针保留超过 4 个字节才能接收 long?

转载 作者:行者123 更新时间:2023-12-02 10:59:42 28 4
gpt4 key购买 nike

我正在使用 JNA 与使用 Visual Studio 2015 编译的 native C 库进行通信。我正在 64 位计算机上工作。我试图通过长指针 long *pdays 参数接收 C 函数的值。我遇到以下异常:

java.lang.IndexOutOfBoundsException: Bounds exceeds available space : size=4, offset=8 at com.sun.jna.Memory.boundsCheck(Memory.java:220) at com.sun.jna.Memory.getLong(Memory.java:498)

我不明白我在这里错过了什么,如果我只为指针保留 4 个字节的内存,这会导致上面的崩溃,但是如果我保留 8 个字节,一切都会正常。但是 sizeof(long) 返回 4,那么为什么我需要保留超过 4 个字节呢?

    System.out.println(NativeLong.SIZE); // --> 4
System.out.println(Native.LONG_SIZE); // --> 4

// Pointer pDays = new Memory(Native.LONG_SIZE); Results in IndexOutOfBoundsException
Pointer pDays = new Memory(8); //

nativeLib.GetDaysUntilExpiration(pDays);
return pDays.getLong(0); // crashes here when reserving just 4 bytes

最佳答案

它崩溃是因为您试图从仅分配了 4 个字节的 native 内存中读取 8 个字节。

native 类型是什么并不重要,或者它只有 4 个字节。 内存仅保存 4 个字节,您可以按照您希望的任何方式对其进行解释。您可以获得一个 byte[] 数组,或一个 int (包含这 4 个字节),甚至一个 shortbyte 仅读取该字节数。您甚至可以尝试使用 String (尽管没有空终止符,您可能会读取超出允许的 4 个字节的内容,谁知道您会得到什么,所以这会很危险。)

您要求获取一个 Java long,它是一个 8 字节变量;因此,代码会检查偏移量的接下来 8 个字节是否适合分配的内存。 Memory.java 中的代码具有以下硬编码:

boundsCheck(offset, 8);

javadoc 很清楚为什么会这样:

Indirect the native pointer to malloc space, a la Pointer.getLong. But this method performs a bounds checks to ensure that the indirection does not cause memory outside the malloced space to be accessed.

执行您正在执行的操作(无需手动分配空间)的正确方法是简单地使用 NativeLongByReference。 JNA 将自行处理空间分配和值检索,您不必担心 native 大小。

NativeLongByReference pDays = new NativeLongByReference();
nativeLib.GetDaysUntilExpiration(pDays);
return pDays.getValue().longValue();

编辑:我在您的评论中注意到您说“C 函数参数是一个指针,使用 NativeLongByReference 将导致“LongByReference 无法转换为指针”——这不是 C 函数的问题,而是接口(interface)中的 JNA 映射。最好更改 GetDaysUntilExpiration 的 JNA 映射以采用 NativeLongByReference 参数。如果您无法更改该函数的 JNA 映射,您可以通过使用 pDays.getPointer() 作为参数来解决这个问题。

关于java - 当 sizeof(long) 为 4 时,为什么需要为 JNA 指针保留超过 4 个字节才能接收 long?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51427142/

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