2016-07-26 2 views
0

Я хочу назвать эту функцию:Как передать структуру по ссылке с ЮНА

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

определена в C++ dll.socketStruct является структура, определенная ниже:

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

эквивалентный код в Яве :

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 при вызове родной функции. У вас есть идея?

ответ

1

Все параметры JNA Structure по умолчанию (struct*) семантика.

При появлении в качестве элементов структуры они по умолчанию используют семантику значения.

Интерфейсы тегов ByReference и ByValue предназначены для использования там, где вы нуждаетесь в дополнительном поведении. Если поведение по умолчанию - это то, что вы хотите, вам не нужно вводить дополнительную команду.

Вы должны всегда предоставлять конструктор, основанный на Pointer, до Structure, который вы определяете, это позволяет избежать избыточного распределения памяти по JNA.