Java Native Access
作者 | Todd Fast、Timothy Wall、Liang Chen |
---|---|
初版 | 2007年5月9日 (2007年05月09日) |
最新版 | |
リポジトリ | ウィキデータを編集 |
プログラミング 言語 | C, Java |
対応OS | Windows, macOS, Android, AIX, FreeBSD, Linux, OpenBSD, Solaris, Windows Mobile |
プラットフォーム | Javaプラットフォーム 1.4 以降(JNA 3.5.2 以前)、Java 1.6(JNA 4.0.0以降) |
サイズ | 1.83 MB(アーカイブのサイズ) |
種別 | ライブラリ |
ライセンス | LGPL 2.1 以降または(バージョン4.0以降は)Apache License 2.0 |
公式サイト |
github |
テンプレートを表示 |
Java Native Access (JNA) とは、JavaプログラムがJava Native Interfaceを用いずにネイティブの共有ライブラリにアクセスする方法を提供するライブラリである。JNA は最小限の作業でネイティブコードにアクセスできることを目指して設計されており、決まりきったアクセスコードを書いたりグルーコードの生成を行ったりせず、ネイティブコードへ正しく簡単にアクセスすることを最優先としている(ただし、性能にも注意が払われている)。JNAライブラリはネイティブコードを呼び出すためにlibffiを用いており、名前を指定してライブラリをロードするネイティブの関数を用いて、目的のライブラリ関数の関数ポインタを取得する。ネイティブコードにアクセスする過程で静的なバインディング、ヘッダファイル、またコンパイルは必要ない。アプリケーションの開発者はJavaのインターフェイスを用いて対象のネイティブライブラリの関数や構造体を記述する。これによって、JNIコードを記述しビルドする大きな労力をかけずにきわめて簡単にネイティブプラットフォームの機能を利用することができる。
JNAの採用例
[編集 ]- JRuby - JNAをPOSIX機能の提供に使用[3] [4]
- Freedom for Media in Java (FMJ)[5]
- IntelliJ IDEA - JetBrains社の統合開発環境
- SVNKit - Pure JavaによるSubversionクライアントライブラリ
- Videolan - JavaによるマルチメディアライブラリVLCJに使用
型の割り当て
[編集 ]JNAライブラリがサポートするJavaとネイティブコードの割り当てを下表に示す[6] 。
ネイティブ型 | サイズ | Java 言語の型 | Windows での一般的な型 |
---|---|---|---|
char | 8ビット整数 | byte | BYTE, TCHAR |
short | 16ビット整数 | short | WORD |
wchar_t | 16/32ビット文字 | char | TCHAR |
int | 32ビット整数 | int | DWORD |
int | 真偽値 | boolean | BOOL |
long | 32/64ビット整数 | NativeLong | LONG |
long long | 64ビット整数 | long | __int64 |
float | 32ビット浮動小数点数 | float | |
double | 64ビット浮動小数点数 | double | |
char* | C 文字列 | String | LPCTSTR |
void* | ポインタ | Pointer | LPVOID, HANDLE, LPXXX |
例
[編集 ]下記のプログラムはプラットフォームの標準Cライブラリをロードし、printf 関数を呼び出す。
注: 以下のコードはWindows、Linux / UNIX / macOSプラットフォームで動作する。
importcom.sun.jna.Library; importcom.sun.jna.Native; importcom.sun.jna.Platform; /** Library の宣言と使用法の簡単な例 */ publicclass HelloWorld{ publicinterface CLibraryextendsLibrary{ CLibraryINSTANCE=(CLibrary)Native.loadLibrary(Platform.isWindows()?"msvcrt":"c",CLibrary.class); voidprintf(Stringformat,Object...args); } publicstaticvoidmain(String[]args){ CLibrary.INSTANCE.printf("Hello, World\n"); for(inti=0;i<args.length;i++){ CLibrary.INSTANCE.printf("Argument %d: %s\n",i,args[i]); } } }
以下の例は、 C POSIXライブラリをロードし、標準APImkdir を呼び出す。
注: 下記のコードはPOSIX環境で動作する。
importcom.sun.jna.Library; importcom.sun.jna.Native; /** POSIXライブラリの宣言と使用法の例 */ publicclass PosixExample{ publicinterface POSIXextendsLibrary{ POSIXINSTANCE=(POSIX)Native.loadLibrary("c",POSIX.class); intchmod(Stringfilename,intmode); intchown(Stringfilename,intuser,intgroup); intrename(Stringoldpath,Stringnewpath); intkill(intpid,intsignal); intlink(Stringoldpath,Stringnewpath); intmkdir(Stringpath,intmode); intrmdir(Stringpath); } publicstaticvoidmain(String[]args){ POSIXposix=POSIX.INSTANCE; posix.mkdir("/tmp/newdir",0777); posix.rename("/tmp/newdir","/tmp/renamedir"); } }
下記のプログラムはKernel32.dll をロードし、Beep とSleep 関数を呼び出す。
注: 下記のコードは Windows でのみ動作する。
importcom.sun.jna.Library; importcom.sun.jna.Native; /** MS-Windows の Library の宣言と使用法の例 */ publicclass BeepExample{ publicinterface Kernel32extendsLibrary{ Kernel32INSTANCE=(Kernel32)Native.loadLibrary("kernel32",Kernel32.class); booleanBeep(intdwFreq,intdwDuration); voidSleep(intdwMilliseconds); } publicstaticvoidmain(String[]args){ Kernel32kernel32=Kernel32.INSTANCE; kernel32.Beep(698,500); kernel32.Sleep(500); kernel32.Beep(698,500); } }
参考文献
[編集 ]- ^ "Releases - java-native-access/jna". GitHub (2020年7月14日). 2020年7月26日閲覧。
- ^ Bläsing, Matthias (2020年7月14日). "Release 5.6.0". Groups.google.com. 2020年7月26日閲覧。
- ^ Java Native Access + JRuby = True POSIX
- ^ JNA brings native code to JRuby
- ^ Freedom for Media in Java
- ^ jna/www/Mappings.md at master · twall/jna
関連項目
[編集 ]外部リンク
[編集 ]- Java Native Access Web Page
- Java Native Access:An easier way to access native code By Jeff Friesen, JavaWorld.com, 2008年5月2日
- Protect Your Legacy Code Investment with JNA by Stephen B. Morris, Java.net, 2009年5月20日
- JNAerator - JNAなどで使うグルーインターフェイスをC/C++などから自動生成するソフトウェア