gpt4 book ai didi

java - 如何使用JNA通过引用传递结构

转载 作者:行者123 更新时间:2023-11-28 05:34:36 26 4
gpt4 key购买 nike

我想调用这个函数:

extern "C" xxx_SERVICE_API int  initSocket(socketStruct* skStruct); 

在 c++ dll.socketStruct 中定义的结构体定义如下:

typedef struct 
{
int a;
int b;
} mystruct;

Java 中的等效代码是:

public interface MyDllClass extends Library {

public static class MyStructure extends Structure {

public static class ByReference extends MyStructureRef
implements Structure.ByReference{


}
@Override
protected List<String> getFieldOrder() {

return Arrays.asList(new String[]{"a","b"});
}
public int a;
public int b;
}
//Native function
int initSocket (MyStructure.ByReference sks);
MyDllClass INSTANCE = (MyDllClass)Native.loadLibrary("Mydll",
MyDllClass.class);
}

如何以引用结构作为参数来调用此 native 函数?谢谢

谢谢您的回答。根据您的说法,我在我的结构中添加了一个构造函数:

public interface MyDllClass extends Library {

public static class MyStructure extends Structure {

public MyStructure() {

idModule = 0;
nbModules = 0;
nbQueueInModule = 3;
portList = new int[128];
serverList = new char[128][20];
}
@Override
protected List<String> getFieldOrder() {

return Arrays.asList(new String[]{"a","b","portList","serverList"});
}
public int a;
public int b;
public int[] portList;
public char[][] serverList;
}
//Native function
int initSocket (MyStructure.ByReference sks);
MyDllClass INSTANCE = (MyDllClass)Native.loadLibrary("Mydll",
MyDllClass.class);
}

主要是我写了这段代码:

MyStructure mySocket = new MyStructure();
MyDllClass.INSTANCE.initSocket(mySocket);

由于调用 native 函数时出现空指针异常,此代码失败。你有想法吗?

最佳答案

所有 JNA Structure 参数默认为引用 (struct*) 语义。

当作为结构成员出现时,它们默认为按值语义。

提供了 ByReferenceByValue 标记接口(interface),供您在需要补充行为的地方使用。如果默认行为是您想要的,则不需要额外的输入。

您应该始终为您定义的 Structure 提供一个基于Pointer 的构造函数,它可以避免 JNA 分配多余的内存。

关于java - 如何使用JNA通过引用传递结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38600092/

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