Java Native Access
最新版 |
3.2.5
/ 2010年4月20日 |
---|---|
リポジトリ | |
プログラミング 言語 | C and Java |
対応OS | クロスプラットフォーム |
サイズ | 606.9 KB (archived) |
種別 | ライブラリ |
ライセンス | LGPL version 2.1 or later. |
公式サイト | http://jna.java.net/ |
Java Native Access (JNA) とは、Java プログラムがJava Native Interfaceを用いずにネイティブの共有ライブラリにアクセスする方法を提供するライブラリである。JNA は最小限の作業でネイティブコードへアクセスできることを目指して設計されており、決まりきったアクセスコードを書いたりグルーコードの生成を行ったりせず、ネイティブコードへ正しく簡単にアクセスすることを最優先としている(ただし、性能にも注意が払われている)。JNA ライブラリはネイティブコードを呼び出すためにlibffiを用いており、名前を指定してライブラリをロードするネイティブの関数を用いて、目的のライブラリ関数の関数ポインタを取得する。ネイティブコードにアクセスする過程で静的なバインディング、ヘッダファイル、またコンパイルは必要ない。アプリケーションの開発者は Java のインターフェイスを用いて対象のネイティブライブラリの関数や構造体を記述する。これによって、JNI コードを記述しビルドする大きな労力をかけずにきわめて簡単にネイティブプラットフォームの機能を利用することができる。
JNA の採用例
- JRuby JNA を POSIX 機能の提供に使用 [1] [2]
- Freedom for Media in Java (FMJ) [3]
- IntelliJ IDEA JetBrains社の統合開発環境
- SVNKit pure Java による Subversion クライアントライブラリ
- Videolan Java によるマルチメディアライブラリ JVLC に使用
型の割り当て
JNA ライブラリがサポートする Java とネイティブコードの割り当てを下表に示す。
Native Type | Size | Java 言語の型 | Windows での一般的な型 |
---|---|---|---|
char | 8-bit integer | byte | BYTE, TCHAR |
short | 16-bit | short | short WORD |
wchar_t | 16/32-bit character | char | TCHAR |
int | 32-bit integer | int | DWORD |
int | boolean value | boolean | BOOL |
long | 32/64-bit integer | NativeLong | LONG |
long long, __int64 | 64-bit integer | long | |
float | 32-bit FP | float | |
double | 64-bit FP | double | |
char* | C 文字列 | String | LPTCSTR |
void* | pointer | Pointer | LPVOID, HANDLE, LPXXX |
例
下記のプログラムはプラットフォームの標準Cライブラリをロードし、printf 関数を呼び出す。
注: 以下のコードはWindows、Linux / Unix / Mac OS Xプラットフォームで動作する。
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
/** Simple example of native library declaration and usage. */
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("Argument %d: %s\n", i, args[i]);
}
}
}
以下の例は、 C POSIX ライブラリをロードし、標準APImkdirを呼び出す。
注: 下記のコードはPOSIX 標準のプラットフォームでは同じように動作する。
import com.sun.jna.Library;
import com.sun.jna.Native;
/** Simple example of native C POSIX library declaration and usage. */
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) {
POSIX posix = (POSIX) Native.loadLibrary("c", POSIX.class);
posix.mkdir("/tmp/newdir", 0777);
posix.rename("/tmp/newdir","/tmp/renamedir");
}
}
下記のプログラムはKernel32.dll をロードし、Beep と Sleep 関数を呼び出す。
注: 下記のコードはWindowsプラットフォームでのみ動作する。
import com.sun.jna.Library;
import com.sun.jna.Native;
/** Simple example of Windows native library declaration and usage. */
public class BeepExample {
public interface Kernel32 extends Library {
// FREQUENCY is expressed in hertz and ranges from 37 to 32767
// DURATION is expressed in milliseconds
public boolean Beep(int FREQUENCY, int DURATION);
public void Sleep(int DURATION);
}
public static void main(String[] args) {
Kernel32 lib = (Kernel32) Native.loadLibrary("kernel32",
Kernel32.class);
lib.Beep(698, 500);
lib.Sleep(500);
lib.Beep(698, 500);
}
}
参考文献
関連項目
外部リンク
- Java Native Access Web Page
- Java Native Access:An easier way to access native code By Jeff Friesen, JavaWorld.com, 02/05/2008
- Protect Your Legacy Code Investment with JNA by Stephen B. Morris, Java.net, 20/05/2009