Java Native Access
作者 Todd Fast、Timothy Wall、Liang Chen
初版 2007年5月9日 (2007-05-09)
最新版
5.6.0 / 2020年7月14日 (5年前) (2020-07-14)[1][2]
リポジトリ ウィキデータを編集
プログラミング
言語
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.com/java-native-access/jna
テンプレートを表示

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

JNAの採用例

編集

型の割り当て

編集

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

注: 以下のコードはWindowsLinux / UNIX / macOSプラットフォームで動作する。

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;

/** Library の宣言と使用法の簡単な例 */
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;

/** POSIXライブラリの宣言と使用法の例 */
public class PosixExample {
    public interface POSIX extends Library {
        POSIX INSTANCE = (POSIX) Native.loadLibrary("c", POSIX.class);
        int chmod(String filename, int mode);
        int chown(String filename, int user, int group);
        int rename(String oldpath, String newpath);
        int kill(int pid, int signal);
        int link(String oldpath, String newpath);
        int mkdir(String path, int mode);
        int rmdir(String path);
    }

    public static void main(String[] args) {
        POSIX posix = POSIX.INSTANCE;
        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;

/** MS-Windows の Library の宣言と使用法の例 */
public class BeepExample {
    public interface Kernel32 extends Library {
        Kernel32 INSTANCE = (Kernel32) Native.loadLibrary("kernel32", Kernel32.class);
        boolean Beep(int dwFreq, int dwDuration);
        void Sleep(int dwMilliseconds);
    }

    public static void main(String[] args) {
        Kernel32 kernel32 = Kernel32.INSTANCE;
        kernel32.Beep(698, 500);
        kernel32.Sleep(500);
        kernel32.Beep(698, 500);
    }
}

参考文献

編集
  1. ^ Releases - java-native-access/jna”. GitHub (2020年7月14日). 2020年7月26日閲覧。
  2. ^ Bläsing, Matthias (2020年7月14日). “Release 5.6.0”. Groups.google.com. 2020年7月26日閲覧。
  3. ^ Java Native Access + JRuby = True POSIX
  4. ^ JNA brings native code to JRuby
  5. ^ Freedom for Media in Java
  6. ^ jna/www/Mappings.md at master · twall/jna

関連項目

編集

外部リンク

編集

📚 Artikel Terkait di Wikipedia

Java Native Interface

Java Native Interface (JNI) は、Javaプラットフォームにおいて、Javaで記述されたプログラムと、他のプログラミング言語(たとえばCやC++など)で書かれた、実際のCPU上で動作するコード(ネイティブコード)とを連携するためのインタフェース仕様である。Java

Jakarta EE

Cloud Native Java. 2025年9月28日閲覧。 ウィキブックスにJava関連の解説書・教科書があります。 ウィキメディア・コモンズには、Jakarta EEに関連するカテゴリがあります。 Java 、Java#エディション(Java SE、Java EE、Java MEなど)、Java#バージョン履歴(JDK

Javaバージョン履歴

本稿ではJavaプラットフォームの基準であるスタンダード版(Java SE)のメジャーバージョン履歴を説明する。Java Cardの仕様はJava SEとは独立してリリースされている。 Java 8まで存在した、エンタープライズ版、マイクロ版はスタンダード版改訂を基準にしそれに後発する時系列でリリ

Microsoft Jet Database Engine

^ Gorm Braarvig. “Access database from SQL 2005/64”. 2007年6月18日閲覧。 ^ Jakšić (2008年8月). “Developing Access 2007 Solutions with Native C or C++”. Microsoft

Tizen

Web framework および Native framework の2種類からなる。開発言語は Web framework では HTML5 、JavaScript (jQuery/jQuery Mobile) などが、Native framework では C/C++ が使用される。Web

名前修飾

JVMからネイティブ名への変換: オラクルがスキームを公開している。 一般的なC++の名前修飾: 前述を参照。 これとは別に、Java Native Access (JNA) は、Javaプログラムからネイティブの共有ライブラリにアクセスする方法をライブラリレベルで提供する。

OpenCL

Trail (2016年以降、開発終了) Java Aparapi JogAmp - OpenCL, OpenGL, OpenAL, OpenMAX の Java ラッパー LWJGL - OpenCL, OpenGL, OpenAL などの Java ラッパー LISP系 Harlan Python

Google Cloud

a Service)、旧称Google Container Engine Cloud Functions - Node.js、Python、Go、Java、Ruby、PHP、.NETで書かれた、HTTPもしくはイベント駆動のコードを実行できるFunctions as a Service(英語版) Cloud