日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

Atitit.java jna  调用c  c++ dll的原理与实践  总结  v2  q27

發布時間:2023/11/27 生活经验 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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接口。

DllC函數的集合、容器,這正和接口的概念吻合。

?

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)
學習JNAJnative個人總結?-?80后的夢想?-?ITeye技術網站.htm
(impt)Java?JNA?詳解?-?夢想是奢侈品,向奢侈品進軍?-?博客頻道?-?CSDN.NET.htm
本文原名《使用JNA方便地調用原生函數》發表于20093月的程序員雜志上。
[-]

????介紹
????實現原理
????????調用原生函數
????????????使用JNA調用原生函數
????????????調用原生函數的模式
????和原生代碼的類型映射
????????和操作系統數據類型的對應表
????????支持常見的數據類型的映射
????模擬結構體
????????使用JNA調用使用StructC函數
????????????說明
????????模擬復雜結構體
????????????結構體內部可以包含結構體對象的數組
????????????結構體內部可以包含結構體對象的指針的數組
????代碼
????????通過回調函數實現原生代碼調用Java代碼
????????回調函數說明
????模擬指針
????????使用PointerByReference模擬指向指針的指針
????????模擬指針
????????類詳解

?

?

?

轉載于:https://www.cnblogs.com/attilax/p/5963542.html

總結

以上是生活随笔為你收集整理的Atitit.java jna  调用c  c++ dll的原理与实践  总结  v2  q27的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。