| 原作者 | トッド・ファスト、ティモシー・ウォール、リャン・チェン |
|---|---|
| 初回リリース | 2007年5月9日 |
| 安定リリース | 5.14.0 / 2023年12月10日[1] |
| リポジトリ |
|
| 書かれた | CとJava |
| オペレーティング·システム | 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 ソフトウェア ライセンス バージョン 2.0 |
| Webサイト | github.com/java-native-access/jna |
Java Native Access ( JNA ) は、 Java Native Interface (JNI)を使用せずにJavaプログラムがネイティブ共有ライブラリに簡単にアクセスできるようにする、コミュニティ開発のライブラリです。JNA の設計は、最小限の労力で自然な方法でネイティブ アクセスを提供することを目指しています。JNI とは異なり、定型コードや生成されたグルー コードは必要ありません。
建築
JNA ライブラリは、外部関数インターフェースライブラリ ( libffi )と呼ばれる小さなネイティブ ライブラリを使用して、ネイティブ コードを動的に呼び出します。JNA ライブラリはネイティブ関数を使用して、コードが名前でライブラリをロードし、そのライブラリ内の関数へのポインターを取得できるようにします。また、 libffiライブラリを使用してそれを呼び出します。これらはすべて、静的バインディング、ヘッダー ファイル、またはコンパイル フェーズなしで実行されます。開発者は、Java インターフェースを使用して、対象のネイティブ ライブラリ内の関数と構造を記述します。これにより、 JNIコードの構成とビルドという大きな開発オーバーヘッドを発生させることなく、ネイティブ プラットフォームの機能を簡単に活用できます。
JNA は、 macOS、Microsoft Windows、FreeBSD / OpenBSD、Solaris、Linux、AIX、Windows Mobile、Android上で構築およびテストされています。ネイティブ ビルド構成を微調整して再コンパイルし、Java を実行する他のほとんどのプラットフォームで動作するようにすることも可能です。
マッピングの種類
次の表は、Javaとネイティブコード間の型マッピングとJNAライブラリでサポートされている型の概要を示しています。[2]
注: TCHARの意味は、一部のプリプロセッサ定義に応じてcharとwchar_tの間で変わります。LPCTSTRが続きます。
データ構造のメモリバイトアライメント
ネイティブ ライブラリには、標準化されたメモリ バイト アラインメント フレーバーはありません。JNA はデフォルトで OS プラットフォーム固有の設定になりますが、ライブラリ固有のカスタム アラインメントによって上書きできます。ネイティブ ライブラリのドキュメントにアラインメントの詳細が記載されていない場合は、Java ラッパーの実装中に試行錯誤して正しいアラインメントを決定する必要があります。
例
次のプログラムは、ローカルC 標準ライブラリの実装をロードし、それを使用してprintf関数を呼び出します。
注:次のコードは移植可能であり、Windowsおよび POSIX ( Linux / Unix / macOS ) プラットフォームで同じように動作します。
com.sun.jna.Libraryをインポートします。com.sun.jna.Nativeをインポートします。com.sun.jna.Platformをインポートします。
/** ネイティブ ライブラリの宣言と使用法の簡単な例。 */
public class HelloWorld { public interface CLibrary extends Library { CLibrary INSTANCE = ( CLibrary ) Native . loadLibrary ( ( Platform . isWindows () ? "msvcrt" : "c" ), CLibrary . class ); void printf ( String format , Object ... args ); }
public static void main ( String [] args ) { CLibrary.INSTANCE.printf ( " Hello , World \ n" ) ; for ( int i = 0 ; i < args.length ; i ++ ) { CLibrary.INSTANCE.printf ( "引数 %d : % s \n" , i , args [ i ] ) ; } } }
次のプログラムは、C POSIX ライブラリをロードし、それを使用して標準のmkdir関数を呼び出します。
注:次のコードは移植可能であり、POSIX標準プラットフォームでも同じように動作します。
com.sun.jna.Libraryをインポートします。com.sun.jna.Nativeをインポートします。
/** ネイティブ C POSIX ライブラリの宣言と使用法の簡単な例。 */
public class ExampleOfPOSIX { public interface POSIX extends Library { public int chmod ( String filename , int mode ); public int chown ( String filename , int user , int group ); public int rename ( String oldpath , String newpath ); public int kill ( int pid , int signal ); public int link ( String oldpath , String newpath ); public int mkdir ( String path , int mode ); public int rmdir ( String path ); }
public static void main ( String [] args ) { // Windows で部分的な POSIX サポートのために msvcrt をロードすることは可能です... POSIX posix = ( POSIX ) Native . loadLibrary ( "c" , POSIX . class ); // ただし、/tmp が見つからないため、Windows では失敗します。posix . mkdir ( "/tmp/newdir" , 0777 ); posix . rename ( "/tmp/newdir" , "/tmp/renamedir" ); } }
以下のプログラムは、Kernel32.dllをロードし、それを使用してBeep関数とSleep関数を呼び出します。
注:次のコードはWindowsプラットフォームでのみ動作します。
com.sun.jna.Libraryをインポートします。com.sun.jna.Nativeをインポートします。
/** Windows ネイティブ ライブラリの宣言と使用法の簡単な例。 */
public class BeepExample { public interface Kernel32 extends Library { // FREQUENCY はヘルツで表され、範囲は 37 ~ 32767 です// DURATION はミリ秒で表されますpublic boolean Beep ( int FREQUENCY , int DURATION ); public void Sleep ( int DURATION ); }
パブリック静的void main ( String [] args ) { Kernel32 lib = ( Kernel32 ) Native . loadLibrary ( "kernel32" , Kernel32 . class ); lib . Beep ( 698 , 500 ); lib . Sleep ( 500 ); lib . Beep ( 698 , 500 ); } }
パフォーマンス
ベンチマークによると、JNAの平均速度はJNIの10倍遅いことが示されています。[3] [4] [5]
代替案
いくつかの代替案が登場しています。[6]これらのソフトウェア開発ツールを評価する際には、コードの実装の容易さと実行速度のトレードオフを考慮する必要があります。再配布および更新が必要なサードパーティの依存ライブラリの追加は、どのツールを使用するかを決定するもう1つの要素です。テクノロジの準備レベルも考慮する必要があります。
参照
参考文献
- ^ 「リリース 5.14.0」。GitHub。2023年1月14日。
- ^ 「デフォルトの型マッピング」。jna.dev.java.net 。 2011年8月2日閲覧。
- ^ 「JNI vs JNA パフォーマンス」。Reddit 。 2023年3月30日閲覧。
- ^ 「JNI vs JNA ベンチマーク」。Medium 。2023年3月30日閲覧。
- ^ 「JNI vs JNA パフォーマンス ベンチマーク」。Stack Overflow。2023年3月 30 日閲覧。
- ^ 「JNIの代替手段が登場」。OKTA 。 2023年3月30日閲覧。
外部リンク
- Java ネイティブ アクセス Web ページ
- Java Native Access - ダウンロード ページ
- Java Native Access - ユーザーメーリングリスト
- Friesen, Jeff (2008 年 2 月 5 日)。「オープンソース Java プロジェクト: Java Native Access」。オープンソース Java チュートリアル。JavaWorld。2020年7 月 27 日閲覧。
- Morris, Stephen B. (2009 年 5 月 20 日)。「JNA でレガシー コードへの投資を保護する」。today.java.net。2015年 1 月 13 日のオリジナルからアーカイブ。
- Dasgupta, Sanjay (2009 年 11 月 11 日)。「JNA によるネイティブ コード アクセスの簡素化」。today.java.net。2009年 11 月 15 日のオリジナルからアーカイブ。
- Doubrovkine, Daniel (2011 年 6 月 20 日). 「JNA は Githubber になりました」. code.dblock.org . 2020 年 7 月 27 日閲覧。
- Kiaer, Jesper (2010 年 3 月 21 日)。「JNA を使用した Lotus Domino C-API の呼び出し」。Nevermind.dk。2020年7 月 27 日閲覧。
