JNA(Java Native Access)の注意点

JNIを簡単にしたjna(Java Native Access)というものがあります。JNIと異なり、Pure Javaのみの記述でライブラリを呼び出すことができるものです。C#のアンマネージドコードを呼び出すSystem.Runtime.InteropServices.DllImportみたいに、関数のヘッダの定義は、Javaがわかる形で書く必要があります。

利用例としては、Posixのライブラリを呼び出すものがあり(その1その2),JRubyPosix操作関数あたりが実用的なサンプルです。

注意点としては、

  • Native.loadLibraryで指定するライブラリ名は、lib***のlibを除いた***を指定する。例 libcなら"c"
  • Union構造体は、Native関数を呼び出す前に、setType()で利用するフィールドの型を設定しないと、正しく動作しない。(JNAのトップページで、"but require that you indicate which union field is active with the setType method before it can be properly passed to a function call."と書いてあるが、javadocの方には書いていない。) なお、setTypeは、リフレクションによって利用するフィールドを指定するので、int.classのようにプリミティブ型の指定も可能。