2016-07-26 17 views
0

を参照することによって構造体を渡すために:Javaではどのように私はこの関数を呼び出したいJNA

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

同等のコードは次のとおりです。Cで定義されて

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

++ dll.socketStructは、以下に定義された構造であります:

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); 
} 

このネイティブ関数を参照として構造体でパラメータとして呼び出すにはどうすればよいですか? ありがとうございます

ありがとうございました。あなたと一緒によると、私は構造体にコンストラクタを追加します。ネイティブ関数を呼び出すときに

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

このコードが原因NULLポインタ例外の失敗:

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); 
} 

がメインで、私はこのコードを書きました。 アイデアはありますか?

答えて

1

すべてJNA Structureパラメータはデフォルトで参照(struct*)セマンティクスになります。

構造体メンバーとして表示されるときは、デフォルトで値セマンティクスが使用されます。

補足的な動作が必要な場合に使用するために、ByReferenceおよびByValueのタグ付けインターフェイスが用意されています。デフォルトの振る舞いがあなたが望むものなら、余分なタイピングは必要ありません。

Pointerコンストラクタを定義したStructureに指定する必要があります。これにより、JNAによる余計なメモリ割り当てが回避されます。

関連する問題