コンテンツにスキップ

Java Native Access

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

これはこのページの過去の版です。MoreNet (会話 | 投稿記録) による 2013年12月28日 (土) 11:57個人設定で未設定ならUTC)時点の版であり、現在の版とは大きく異なる場合があります。

Java Native Access
開発元 Timothy Wall
最新版
4.0.0 / 2013年7月4日 (11年前) (2013-07-04)
リポジトリ ウィキデータを編集
プログラミング
言語
C, Java
対応OS クロスプラットフォーム
(Windows, OS X, Android, AIX, FreeBSD, OpenBSD, Solaris, WinCE)
サイズ 606.9 KB (archived)
種別 ライブラリ
ライセンス LGPL 2.1 以降もしくは Apache License 2.0
公式サイト github.com/twall/jna
テンプレートを表示

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);
   }
}

参考文献

関連項目

外部リンク