[英]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.