簡體   English   中英

如何通過JNA通過引用傳遞結構

[英]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* )語義。

當顯示為結構成員時,它們默認為按值語義。

提供了ByReferenceByValue標記接口,以用於需要補充行為的地方。 如果默認行為是您想要的,則不需要額外的輸入。

您應該始終為您定義的Structure提供基於Pointer的構造函數,這樣可以避免JNA分配過多的內存。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM