學(xué)習(xí)JNA的一天-自定義DLL以及被Java調(diào)用

個人習(xí)慣晶乔,飲水思源族铆。先丟我學(xué)習(xí)視頻地址:Java使用JNA調(diào)用C/C++動態(tài)鏈接庫dll

以下為學(xué)習(xí)總結(jié),注釋為臨時的個人理解,并沒有百度"求證"

視頻中有如何調(diào)用Windows系統(tǒng)中自帶的DLL的方法。
本文并沒有總結(jié),有自定義讲坎、以及如何調(diào)用就差不多,以后的路得靠自己慢慢踩坑摸索了

總之愧薛,這樣可以有效得擴展Java不能操作內(nèi)存之類得弊端晨炕,順便學(xué)點C++(C)也是不錯地~


開發(fā)環(huán)境

1、win10 64位 i7 8750H 16G
2毫炉、Visual Studio Community 2019(下面簡稱VS)
3瓮栗、IntelliJ IDEA 2019.3.3 (Ultimate Edition)(下面簡稱IDEA)
4、jdk1.8(64位)

開發(fā)準(zhǔn)備

  • 安裝自定義dll動態(tài)庫必要的環(huán)境
    使用C++的桌面開發(fā) 即可
    使用C++的桌面開發(fā)

自定義動態(tài)鏈接庫(DLL)

一瞄勾、創(chuàng)建具有導(dǎo)出項的動態(tài)鏈接庫項目

說直白點费奸,就是等會Java調(diào)用的dll文件

vs創(chuàng)建項目快捷鍵 Ctrl + Shift + N
或者看下圖

創(chuàng)建項目

具有導(dǎo)出項的動態(tài)鏈接庫

名字隨便取,然后點創(chuàng)建

配置

就在這里面擼代碼进陡,有C++(C)基礎(chǔ)的愿阐,一看就知道自動生成的代碼啥意思

image.png

二、擼自定義dll中的方法

后面會有"大量代碼"趾疚,不知道代碼加哪里的缨历,看截圖。糙麦。辛孵。
這里就和Java中的接口(interface)有些相似,等會也會用到Java中的接口(interface)

  • 在TestDll.cpp中添加一個兩數(shù)相加的方法
#include <iostream>
#include <stdio.h>

TESTDLL_API int add(int a, int b) {
    int value = a + b;
    // c++:cout打印  << 相當(dāng)于是 Java中字符串相加  end結(jié)束  endl 結(jié)束并且換行
    cout << "C++打印: TestDll add: " << value << endl;
    // c 打印
    printf("C打印:TestDll add: %d", value);
    return value;
}
image.png
  • 在TestDll.h中聲明add這個方法
    這里extern "C" 的意思是赡磅,告訴編譯器最終以C的形式去編譯
extern "C" TESTDLL_API int add(int a, int b);
image.png

到這里觉吭,一個簡單的含有add方法的Dll動態(tài)庫內(nèi)部代碼就寫完了,接下來是生成DLL

三仆邓、生成DLL

這里注意!
因為我jdk安裝的是64位的伴鳖,所以生成的Dll也要是64的

  • 配置vs(vs默認(rèn)32位)节值,切換成x64就好了
image.png
  • 生成DLL文件

快捷鍵 F6
或者看下圖

image.png

紅框中的就是DLL生成存放的路徑

image.png

我們?nèi)フ业剿?/p>

image.png
image.png

到此,自定義DLL就結(jié)束了榜聂,下面總結(jié)Java通過JNA調(diào)用DLL

Java調(diào)用DLL動態(tài)鏈接庫

一搞疗、新建一個普通的Java項目

這里就不說了,直接跳過须肆。匿乃。桩皿。有個main就行。幢炸。泄隔。
并將我們自己生成的dll復(fù)制到項目中,最終結(jié)構(gòu)(純屬個人習(xí)慣宛徊,放哪里隨你便)如下圖
補充說明:小地雷③JNA.jar

image.png

二佛嬉、封裝DLL的調(diào)用接口

其中 int add(int a, int b); 就是自定義DLL中的方法接口
埋個小地雷①!看最后闸天!

public interface MyDll extends Library {

    MyDll MY_DLL = Native.load((MyDll.class.getClassLoader().getResource("dll/TESTDLL.dll").getPath()).substring(1), MyDll.class);

    /**
     * Dll中的方法
     *
     * @param a 參數(shù)
     * @param b 參數(shù)
     * @return a + b
     */
    int add(int a, int b);
}
image.png

三暖呕、調(diào)用封裝的DLL接口

調(diào)用并運行

    public static void main(String[] args) {
        int add = MyDll.MY_DLL.add(1, 1);
        System.out.println("Java:" + add);
    }
image.png

四、最終輸出結(jié)果

image.png

最后-挖地雷

小地雷①:Java最終輸出結(jié)果為亂碼
解決辦法:在vs中配置文件編碼

image.png
image.png

小地雷②:Java運行報錯苞氮,不是有效的的win32 應(yīng)用程序
解決辦法:回到上面 自定義動態(tài)鏈接庫(DLL) 中的 生成DLL文件

小地雷③JNA.jar:創(chuàng)建maven項目
添加JNA相關(guān)依賴

    <dependency>
      <groupId>net.java.dev.jna</groupId>
      <artifactId>jna</artifactId>
      <version>5.5.0</version>
    </dependency>
    <dependency>
      <groupId>net.java.dev.jna</groupId>
      <artifactId>jna-platform</artifactId>
      <version>5.5.0</version>
    </dependency>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末湾揽,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子笼吟,更是在濱河造成了極大的恐慌库物,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赞厕,死亡現(xiàn)場離奇詭異艳狐,居然都是意外死亡,警方通過查閱死者的電腦和手機皿桑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進(jìn)店門毫目,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人诲侮,你說我怎么就攤上這事镀虐。” “怎么了沟绪?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵刮便,是天一觀的道長。 經(jīng)常有香客問我绽慈,道長恨旱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任坝疼,我火速辦了婚禮搜贤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘钝凶。我一直安慰自己仪芒,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著掂名,像睡著了一般据沈。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上饺蔑,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天锌介,我揣著相機與錄音,去河邊找鬼膀钠。 笑死掏湾,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的肿嘲。 我是一名探鬼主播融击,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼雳窟!你這毒婦竟也來了尊浪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤封救,失蹤者是張志新(化名)和其女友劉穎拇涤,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體誉结,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡鹅士,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了惩坑。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掉盅。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖以舒,靈堂內(nèi)的尸體忽然破棺而出趾痘,到底是詐尸還是另有隱情,我是刑警寧澤蔓钟,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布永票,位于F島的核電站,受9級特大地震影響滥沫,放射性物質(zhì)發(fā)生泄漏侣集。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一兰绣、第九天 我趴在偏房一處隱蔽的房頂上張望肚吏。 院中可真熱鬧,春花似錦狭魂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽斋泄。三九已至,卻和暖如春镐牺,著一層夾襖步出監(jiān)牢的瞬間炫掐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工睬涧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留募胃,地道東北人。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓畦浓,卻偏偏與公主長得像痹束,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子讶请,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內(nèi)容