[英]How to pass structure by reference with JNA
我想调用这个函数:
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);
}
如何通过引用将结构作为参数来调用此本机功能? 谢谢
谢谢您的回答。 根据您的说法,我在我的结构中添加了一个构造器:
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);
调用本机函数时,此代码由于Null指针异常而失败。 你有想法吗 ?
所有JNA Structure
参数默认为按引用( struct*
)语义。
当显示为结构成员时,它们默认为按值语义。
提供了ByReference
和ByValue
标记接口,以用于需要补充行为的地方。 如果默认行为是您想要的,则不需要额外的输入。
您应该始终为您定义的Structure
提供基于Pointer
的构造函数,这样可以避免JNA分配过多的内存。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.