コンテンツにスキップ

Java Native Access

出典: フリー百科事典『ウィキペディア(Wikipedia)』

これはこのページの過去の版です。MoreNet (会話 | 投稿記録) による 2011年4月19日 (火) 04:54個人設定で未設定ならUTC)時点の版 (外部リンク)であり、現在の版とは大きく異なる場合があります。

Java Native Access
最新版
3.2.5 / 2010年4月20日 (15年前) (2010-04-20)
リポジトリ ウィキデータを編集
プログラミング
言語
C and Java
対応OS クロスプラットフォーム
サイズ 606.9 KB (archived)
種別 ライブラリ
ライセンス LGPL version 2.1 or later.
公式サイト https://jna.dev.java.net
テンプレートを表示

Java Native Access (JNA) とは、Java プログラムがJava Native Interfaceを用いずにネイティブの共有ライブラリにアクセスする方法を提供するライブラリである。JNA は最小限の作業でネイティブコードへアクセスできることを目指して設計されており、決まりきったアクセスコードを書いたりグルーコードの生成を行ったりせず、ネイティブコードへ正しく簡単にアクセスすることを最優先としている(ただし、性能にも注意が払われている)。JNA ライブラリはネイティブコードを呼び出すためにlibffiを用いており、名前を指定してライブラリをロードするネイティブの関数を用いて、目的のライブラリ関数の関数ポインタを取得する。ネイティブコードにアクセスする過程で静的なバインディング、ヘッダファイル、またコンパイルは必要ない。アプリケーションの開発者は Java のインターフェイスを用いて対象のネイティブライブラリの関数や構造体を記述する。これによって、JNI コードを記述しビルドする大きな労力をかけずにきわめて簡単にネイティブプラットフォームの機能を利用することができる。

JNA の採用例

型の割り当て

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 関数を呼び出す。

注: 以下のコードはWindowsLinux / 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 をロードし、BeepSleep 関数を呼び出す。

注: 下記のコードは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);
   }
}

参考文献

関連項目

外部リンク