当前位置: 首页 > 知识库问答 >
问题:

JNA更新结构由引用()麻烦

梁泰
2023-03-14

这是我第一次使用JNA。我想做的是在一个DLL中调用一个函数

这是我的JNA结构“新设备”

import java.util.Arrays;
import java.util.List;
import com.sun.jna.*;

public class NeoDevice extends Structure {
    public volatile int DeviceType;
    public volatile int Handle;
    public volatile int NumberOfClients;
    public volatile int SerialNumber;
    public volatile int MaxAllowedClients;
    public NeoDevice() {
       super();
    }
    protected List<? > getFieldOrder() {
         return Arrays.asList("DeviceType", "Handle", "NumberOfClients", "SerialNumber", "MaxAllowedClients");
    }
    public NeoDevice(int DeviceType, int Handle, int NumberOfClients, int SerialNumber, int MaxAllowedClients) {
        super();
        this.DeviceType = DeviceType;
        this.Handle = Handle;
        this.NumberOfClients = NumberOfClients;
        this.SerialNumber = SerialNumber;
        this.MaxAllowedClients = MaxAllowedClients;
    }
    protected ByReference newByReference() { return new ByReference(); }
    protected ByValue newByValue() { return new ByValue(); }
    protected NeoDevice newInstance() { return new NeoDevice(); }

    public static class ByReference extends NeoDevice implements Structure.ByReference {

    };
    public static class ByValue extends NeoDevice implements Structure.ByValue {

    };
}

我正在尝试使用“updateStrucureByReference(类类型、对象、对象指针)”更新字段。我不相信我的“类类型”参数是正确的还是正确的?我是不是做错了什么事?将非常感谢任何输入。

当我尝试打印字段时,它们似乎都是零。

在我的主要班级里

    NeoDevice.ByReference myDeviceByRef = new NeoDevice.ByReference();
    NeoDevice.ByValue myDeviceByVal = new NeoDevice.ByValue();
    NeoDevice myDevice = new NeoDevice();

    int [] NumDevices;
    NumDevices  = new int [1];
    NumDevices[0] = 1;

    int iResult = n40.icsneoFindNeoDevices(65535, myDeviceByRef.getPointer(), NumDevices);
    int icsneoGetDLLVersion = n40.icsneoGetDLLVersion();

    Object serialN = myDeviceByRef.readField("SerialNumber");
    NeoDevice.ByReference myDeviceBy = Structure.updateStructureByReference(NeoDevice.ByReference, myDeviceByRef, myDeviceByRef.getPointer());

共有1个答案

仰翰采
2023-03-14

< code > structure . updatestructurebyreference 不是一个公共函数,这应该是您做错了的第一个迹象。

通过声明您的结构字段<code>volatile</code>,您告诉JNA避免将它们的值复制到本机内存,这通常是在本机函数调用之前自动执行的。只有当您打算将Java字段中的值传递给本机函数时,这才是一个问题;如果您只对读回结果感兴趣,那么<;code>;volatile<;/code>;并不重要。

如果您的 icsneoFindNeo 被声明为将 NeoDevice 实例作为其第二个参数(而不是指针),那么 JNA 将自动正确同步结构字段(它将在函数调用后更新 Java 字段)。当 JNA 遇到结构参数时,它会在调用之前将所有 Java 字段写入本机内存,并在调用之后根据本机内存更新它们。

编辑

根据头文件DeviceType应该使用NativeLong;您的声明将无法在Windows以外的任何64位系统上正常运行。

确保您的库正在使用< code>stdcall调用约定(名义上这意味着实现< code>StdCallLibrary接口)。

您似乎还为DeviceType提供了一个无效的(“65535”)值;检查< code>NumDevices[0]中返回的值是否不为零。

您还应该检查返回值;如果它是零,那么你不应该期望任何东西被写到你的结构中。

 类似资料:
  • 问题内容: 我在测试代码中有一个数组 要求arr [0] .GetId() 服务器是接口。ServerInstance是实现接口方法的结构,即 我有一个像 这正在更新结构的变量“ Id”。我确定值会更新为- 但这并没有反映在第3行的通话中 _*_更新* 范例 http://play.golang.org/p/zUqJ0hEjxv 问题答案: 您在添加结构时将其复制,而不是在示例中放置指向结构本身的

  • 我有这个C++结构和方法,它在.dll/.so中返回: 我试着从Java通过南国防军给它打电话。我的目标是在Java接收这个结构“emxarray_real_t”,以获得对其字段的访问权。我从一个非常简单的代码开始,并以此结束,但仍然有问题--我收到了错误的数据在“大小”,“数据”等。 我该怎么修好它?我遵循了这一指南,但它并没有帮助我完全解决问题:JNA本机函数调用和具有双指针/数组内存分配的结

  • 问题内容: 这应该是地球上最简单的问题,但是即使经过广泛的搜索和修补,我仍然在寻找一种“正确的”方式来放置目录结构并设法正确运行pytest等方面深陷困境。 假设我有一个名为apple的程序。 apple.py包含一些函数,为方便起见,我们将其称为一个。该文件包含一些测试,例如。太好了,太容易了,但是乐趣就开始了: 怎么样在苹果目录…正确吗?空或里面应该有什么? 从根目录调用是最佳实践吗?还是?

  • 问题内容: 为什么当我们使用struct引用结构时,Go似乎会返回的新副本,而不是返回原始的相同地址?这可能是我的误解,所以我要求澄清 输出量 去操场 问题答案: 当你写 您正在复制(dereferences )指向的struct的值。它类似于: 所以是一个类型的新变量,被初始化为的值。这将导致具有不同的内存地址。 请注意,如果是type ,则while 是type 。但是它们是不同的值。更改of

  • 问题内容: 我正在尝试遵循此示例Hyperledger Fabric代码:https : //github.com/hyperledger/education/tree/master/LFS171x/fabric- material 最初,我用go文件chaincode / tuna-app / test.go替换了chaincode / tuna-app / tuna- chaincode.go

  • 我已经将Android Studio更新到3.2版本。 更新后,我的一个项目不想索引。 文件: