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インスタンスを生成します。
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 を書いてみた