Atitit.java jna 调用c c++ dll的原理与实践 总结 v2 q27
Atitit.java?jna??調用c??c++?dll的原理與實踐??總結??v2??q27
?
1.?Jna簡單介紹1
2.?Jna范例halo?owrld1
3.?Jna概念2
3.1.?(1)需要定義一個接口,繼承自Library?或StdCallLibrary2
3.2.?2)接口內部定義2
4.?數據類型映射?NA官方給出的默認類型映射表如下:3
5.??JNA能完全替代JNI嗎?3
6.?參考4
?
1.?Jna簡單介紹
原來使用JNI,你必須手工用C寫一個動態鏈接庫,在C語言中映射Java的數據類型。
JNA中,它提供了一個動態的C語言編寫的轉發器,可以自動實現Java和C的數據類型映射,你不再需要編寫C動態鏈接庫。
2.?Jna范例halo?owrld
??
import?com.sun.jna.Library;?
import?com.sun.jna.Native;?
import?com.sun.jna.Platform;?
???
/**?Simple?example?of?JNA?interface?mapping?and?usage.?*/?
public?class?HelloWorld?{?
???
????//?This?is?the?standard,?stable?way?of?mapping,?which?supports?extensive?
????//?customization?and?mapping?of?Java?to?native?types.?
???
????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類庫dll路徑??msvcrt,沒有采用全路徑,會自動搜索系統路徑下面的。
C:\Windows\winsxs\amd64_microsoft-windows-msvcrt_31bf3856ad364e35_6.1.7600.16385_none_2d4a27c7b8972454\msvcrt.dll
?
作者::?綽號:老哇的爪子?(?全名::Attilax?Akbar?Al?Rapanui?阿提拉克斯?阿克巴?阿爾?拉帕努伊?)?漢字名:艾龍,??EMAIL:1466519819@qq.com
轉載請注明來源:?http://blog.csdn.net/attilax
?
3.?Jna概念
JNA把一個dll/.so文件看做是一個Java接口。
Dll是C函數的集合、容器,這正和接口的概念吻合。
?
3.1.?(1)需要定義一個接口,繼承自Library?或StdCallLibrary
默認的是繼承Library?,如果動態鏈接庫里的函數是以stdcall方式輸出的,那么就繼承StdCallLibrary,比如眾所周知的kernel32庫。比如上例中的接口定義:
?
?
| 1 2 3 | public?interface?CLibrary?extends?Library?{? ??? } |
?
?
3.2.?2)接口內部定義
接口內部需要一個公共靜態常量:INSTANCE,通過這個常量,就可以獲得這個接口的實例,從而使用接口的方法,也就是調用外部dll/so的函數。
該常量通過Native.loadLibrary()這個API函數獲得,該函數有2個參數:
·?第一個參數是動態鏈接庫dll/so的名稱,但不帶.dll或.so這樣的后綴,這符合JNI的規范,因為帶了后綴名就不可以跨操作系統平臺了。搜索動態鏈接庫路徑的順序是:先從當前類的當前文件夾找,如果沒有找到,再在工程當前文件夾下面找win32/win64文件夾,找到后搜索對應的dll?文件,如果找不到再到WINDOWS下面去搜索,再找不到就會拋異常了。比如上例中printf函數在Windows平臺下所在的dll庫名稱是?msvcrt,而在其它平臺如Linux下的so庫名稱是c。
·?第二個參數是本接口的Class類型。JNA通過這個Class類型,根據指定的.dll/.so文件,動態創建接口的實例。該實例由JNA通過反射自動生成。
接口中只需要定義你要用到的函數或者公共變量,不需要的可以不定義,如上例只定義printf函數:
4.?數據類型映射?NA官方給出的默認類型映射表如下:
參見參考
?
5.??JNA能完全替代JNI嗎?
這可能是大家比較關心的問題,但是遺憾的是,JNA是不能完全替代JNI的,因為有些需求還是必須求助于JNI。
使用JNI技術,不僅可以實現Java訪問C函數,也可以實現C語言調用Java代碼。
而JNA只能實現Java訪問C函數,作為一個Java框架,自然不能實現C語言調用Java代碼。此時,你還是需要使用JNI技術。
JNI是JNA的基礎,是Java和C互操作的技術基礎。有時候,你必須回歸到基礎上來。
?
?
6.?參考
Atitit.java?jna?調用c++?dll?的總結
使用JNA訪問Java外部函數接口?-?OPEN?開發經驗庫.htm
paip.java?調用c++?dll?so總結?-?attilax的專欄?-?博客頻道?-?CSDN.NET.htm
參考
Java調用.dll文件?-?抹去浮華,沉淀深度?-?ITeye技術網站.htm?(jnative)
學習JNA,Jnative個人總結?-?80后的夢想?-?ITeye技術網站.htm
(impt)Java?JNA?詳解?-?夢想是奢侈品,向奢侈品進軍?-?博客頻道?-?CSDN.NET.htm
本文原名《使用JNA方便地調用原生函數》發表于2009年3月的“程序員”雜志上。
[-]
????介紹
????實現原理
????????調用原生函數
????????????使用JNA調用原生函數
????????????調用原生函數的模式
????和原生代碼的類型映射
????????和操作系統數據類型的對應表
????????支持常見的數據類型的映射
????模擬結構體
????????使用JNA調用使用Struct的C函數
????????????說明
????????模擬復雜結構體
????????????結構體內部可以包含結構體對象的數組
????????????結構體內部可以包含結構體對象的指針的數組
????代碼
????????通過回調函數實現原生代碼調用Java代碼
????????回調函數說明
????模擬指針
????????使用PointerByReference模擬指向指針的指針
????????模擬指針
????????類詳解
?
?
?
轉載于:https://www.cnblogs.com/attilax/p/5963542.html
總結
以上是生活随笔為你收集整理的Atitit.java jna 调用c c++ dll的原理与实践 总结 v2 q27的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux快捷上传下载文件
- 下一篇: 函数指针amp;绑定: boost::f