0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

JNAeraror使用時のポインタ参照について

Posted at

JavaからCのライブラリを呼ぶ際、ポインタの扱いで躓いた。

C側のインタフェース自体は、JNAeratorでヘッダファイルとライブラリからCUIで生成できるが、
いざ呼び出してみるとポインタから上手く値が取得できない…。

結論としては、ポインタが絡む場合、JNAeratorによって自動生成されるクラスに一手間加える必要がある模様です。
自動生成すればそのまま呼び出せると思い込んでいました…。

@IT様の記事(JNIより簡単にJavaとC/C++をつなぐ「JNA」とは)にあるように、
ポインタを読むにはコンストラクタでメモリを確保してやればいい。
ただしJNAeratorで生成した場合、生成されたクラスを継承し、同様の記述を加えないとポインタは扱えないようです。
(生成されたクラスに記述がない以上、当たり前ではあるが)

引用: @IT JNIより簡単にJavaとC/C++をつなぐ「JNA」とは 

Pointerを渡して、StructureクラスのメンバーメソッドuseMemoryとreadを呼び出して、渡したPointerと同じメモリを共有する_Employeeインスタンスを生成します。

リスト6 Structure[]からPointerに変換するサンプルソースコード
 1 public interface StructureSample extends Library {
 2     public static class _Employee extends Structure {
 3         String id;        /*社員番号*/
 4         String name;    /*氏名*/
 5         int age;          /*年齢*/
 6         String sectionId; /*部署番号*/
 7     }
 8     public _Employee() {
 9         super();
10     }
11     public _Employee (Pointer p) {
12         super();
13         useMemory( p );
14         read();
15     }
16 }

自動だからと頼り切ってしまうと思わぬところで躓きますね。

JNAeratorの実行についてはこちらの記事にお世話になりました。
JNA で java の SDL binding を書いてみた

0
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?