JavaNativeAccess
Java Native Access(JNA) 是一个社群開發的庫,伊使 Java 程式毋免使用 Java Native Interface 就會當輕鬆存取本地共享庫。JNA 的設計旨佇以上少的努力以原生的方式提供本地存取,而且無需要樣板代碼或膠水代碼。
結構
JNA 庫使用一个叫做外部函式介面庫(libffi)的小型本機庫來動態呼叫本機代碼。JNA 庫使用本地的函式,允准代碼照名稱載入庫並檢索指向該庫中函式的指標,使用 libffi 庫來共呼叫,煞無需要靜態結束,標頭檔抑是任何編譯。開發人員使用 Java interface 描述目標本機庫內底的函式佮結構(struct)。 這予得利用平台功能非常容易,避免組態猶閣有構建的 JNI 的懸開銷。
JNA 支援佇咧 macOS,Microsoft Windows,FreeBSD / OpenBSD,Solaris,GNU / Linux,AIX,Windows Mobile 和 Android 上構建和測試。經過適當的調整佮重編譯,會使其實佇大多數會使執行 Java 的平台頂執行。
類型對應
這个表格顯示矣 JNA 所支援的類型佮 java 類型,Windows 通用類型的對應關係 .
注意:根據一寡前置處理器指令佮無仝的實現,TCHAR 可能為 char 抑是 wchar \ _ t。LPCTSTR 嘛是仝款的。
資料結構的記持體位元組對齊
JNA 無規定的記持體位元組的對齊方式。JNA 預設為遵循 OS 平台的設定,但是嘛是會當自訂對齊的方式。若準本機庫的文件無提供關於記憶體對齊的詳細資訊,著愛通過試驗確定著愛正確的對齊方式。
範例
下跤這个例展示矣 JNA 欲按怎載入 C 標準庫並使用其中的 printf 函式。
注意 :這个例是無仝款台的,這意味著伊會當佇 Windows / GNU + Linux / Unix / macOS 執行,並且得著完全仝款的結果。
下跤這个例使用矣 C POSIX 庫並呼叫其中的 mkdir 函式。
注意 :這个例佇咧 POSIX 相容的系統內底是迒平台的,這意味著伊會當佇所有 POSIX 相容系統中執行並得著相仝結果,但是伊無法度佇大多數 Windows 系統上執行。
下跤這个例載入去矣 Kernel 三十二 . dll 並且呼叫其中的 Beep 和 Sleep 函式。
注意 :這个例干焦會當佇 Windows 下執行。
用處
JNA 被用佇下列專案當中:
- Armed Bear Common Lisp , 使用 JNA 實現 CFFI。
- JRuby , 使用 JNA 實現 POSIX 相關功能。
- Freedom for Media in Java ( FMJ )。
- JetBrains 的 IntelliJ IDEA。
- OpenSearchServer , 一个開源搜揣 ia̋n-jín。
- SVNKit , 一个純 Java 的 Java Subversion client 庫,通過 JNA 實現相關功能。
- VLC media player , 佇咧 vlcj 庫中使用。
- Cyberduck 適用佇咧 FTP , SFTP , WebDAV , Cloud Files & Amazon S 三的瀏覽器。
- Log 四 j , 附加紀錄檔庫。
- Hudson 和 ・ Jenkins,繼續整合侍服器。
- Webdriver。
- YAJSW ( Yet Another Java Service Wrapper )。
- Cassandra , 來自 Apache Software Foundation 的開源分布資料庫,使用 JNA。
另見
- P / Invoke
- SWIG
參考連結
外部連結
- Java Native Access Web Page
- Java Native Access-Download page
- Java Native Access-User Mailing List
- Java Native Access : An easier way to access native code by Jeff Friesen , JavaWorld . com , 二千空八孵二二孵五
- Protect Your Legacy Code Investment with JNA by Stephen B . Morris , Java . net , 二千空九九五五鋪二十
- Dasgupta , Sanjay . Simplify Native Code Access with JNA . Java . net . 二千空九九九九十一 [二千空二十五七孵二十三] .(原始內容存檔佇兩千空九石十一鋪十五).
- JNA is now a Githubber by Daniel Doubrovkine , 二千空一十一孵九九二十
- Calling the Lotus Domino C-API with JNA by Jesper Kiaer 二千空一十三抹二十一