跳至內容

Java Native Access

本頁使用了標題或全文手工轉換
維基百科,自由的百科全書
Java Native Access
原作者Todd Fast, Timothy Wall, Liang Chen
首次發布2007年5月9日 (2007-05-09)
當前版本5.5.0(2019年7月19日,​5年前​(2019-07-19[1]
源代碼庫 編輯維基數據鏈接
編程語言CJava
操作系統Windows, macOS, Android, AIX, FreeBSD, GNU/Linux, OpenBSD, Solaris, Windows Mobile
平台Java 1.4 或更高 (只能使用JNA 3.5.2前的版本), Java 1.6 (JNA 4.0.0 以上)
文件大小1.83 MB (存檔後)
類型
許可協議LGPL version 2.1,JNA 4.0後增加了 Apache Software License, version 2.0
網站github.com/java-native-access/jna

Java Native Access (JNA) 是一個由社區開發的庫,它使Java程序無需使用Java Native Interface即可輕鬆訪問本地共享庫。JNA的設計旨在以最少的努力以原生的方式提供本地訪問,且不需要樣板代碼膠水代碼

結構

[編輯]

JNA庫使用一個稱為外部函數接口庫(libffi英語libffi)的小型本機庫來動態調用本機代碼。JNA庫使用本地函數,允許代碼按名稱加載庫並檢索指向該庫中函數的指針,使用libffi庫來調用它,而無需靜態綁定,頭文件或任何編譯。開發人員使用Java interface描述目標本機庫中的函數和結構(struct)。這使得利用平台功能非常容易,而避免了配置或構建JNI的高開銷。

JNA支持在macOS,Microsoft Windows,FreeBSD / OpenBSD,Solaris,GNU/Linux,AIX,Windows Mobile和Android上構建和測試。經過適當調整和重編譯,可以使其在大多數能夠運行Java的平台上運行。

類型對應

[編輯]

這個表格顯示了JNA所支持的類型與java類型,Windows通用類型的對應關係.[2]

C類型 大小 Java類型 Windows通用類型
char 8-bit integer byte BYTE, TCHAR
short 16-bit short short WORD
wchar_t 16/32-bit character char WCHAR, 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 LONGLONG
float 32-bit FP float
double 64-bit FP double
char* C string String LPCTSTR
void* pointer Pointer LPVOID, HANDLE, LPXXX

注意:根據一些預處理器指令和不同的實現,TCHAR可能為char或wchar_t。LPCTSTR也是一樣的。

數據結構的內存字節對齊

[編輯]

JNA沒有規定內存字節的對齊方式。JNA默認為遵循OS平台的設置,但也可以自定義對齊方式。如果本機庫的文檔中未提供關於內存對齊的詳細信息,則必須通過反覆試驗確定正確的對齊方式。

示例

[編輯]

下面這個例子展示了JNA如何加載C標準庫並使用其中的printf函數。

注意: 這個例子是跨平台的,這意味着它可以在 Windows / GNU+Linux / Unix / macOS 運行,並得到完全相同的結果。

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

/** 这个例子展示了JNA的一个用法 */
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庫並調用其中的mkdir函數。

注意: 這個例子在POSIX兼容的系統中是跨平台的,這意味着它可以在所有POSIX兼容系統中運行並獲得相同結果,但它無法在大多數Windows系統上運行。

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;

/** 这是JNA调用Windows dll的一个例子 */
public class BeepExample {
    public interface Kernel32 extends Library {
        // FREQUENCY可以为 37 和 32767间任意一整数
        // DURATION 的单位为毫秒
        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);
    }
}

用處

[編輯]

JNA被用於下列項目中:

另見

[編輯]

參考鏈接

[編輯]
  1. ^ Release 5.5.0. Groups.google.com. 2019-10-30 [2020-07-23]. (原始內容存檔於2011-01-22). 
  2. ^ Default Type Mappings. jna.dev.java.net. [2011-08-02]. (原始內容存檔於2014-06-01). 
  3. ^ asdf/cffi – armedbear. Abcl.org. [2018-12-07]. (原始內容存檔於2020-07-17). 
  4. ^ Nutter, Charles Oliver. Java Native Access + JRuby = True POSIX. 2007-09-02 [2018-12-07]. (原始內容存檔於2020-11-09). 
  5. ^ JNA brings native code to JRuby. infoq.com. 2007-09-05 [2010-05-22]. (原始內容存檔於2020-10-26). 
  6. ^ Home - FMJ. Fmj-sf.net. [2018-12-07]. (原始內容存檔於2020-11-23). 
  7. ^ vlcj. Capricasoftware.co.uk. Caprica Software Limited. [2018-10-23]. (原始內容存檔於2020-11-01). 
  8. ^ dblock/log4jna. GitHub. [2018-10-23]. (原始內容存檔於2020-09-17) (英語). 
  9. ^ apache/cassandra. GitHub. [2018-12-07]. (原始內容存檔於2020-12-10). 

外部連結

[編輯]