摘要:大多數架構采用單一的語言所開發。JNI這項Java中提供的強大功能,卻逐漸的被人遺忘了。
本文分享自華為雲社群《Java中一個逐漸被遺忘的強大功能,強到你難以置信!!》,作者:冰 河。
在Java語言出現之前,很多系統都是使用C和C++開發的。Java出現之後,由于其面向對象的思想更加符合人們的思維習慣,Java也不用像C和C++那樣需要程式員手動管理記憶體的配置設定和回收。說白了,就是簡單好用。由于Java的諸多優點,使其一躍霸榜程式設計語言前排很多年。
為了能夠和使用C和C++寫的程式進行互動,Java提供了本地方法的特性,也就是我們常說的JNI技術,然而,随着網際網路的高速發展,分布式、微服務、大資料、雲計算等技術和架構層出不窮,但大多數架構采用單一的語言所開發。JNI這項Java中提供的強大功能,卻逐漸的被人遺忘了。
最近,在分析了500多TB的資料,從500多TB的資料中分析使用者的行為習慣,以便為使用者提供更好的産品體驗和推薦更加适合使用者的産品。然而,在實作算法的過程中,使用Java語言開發的算法從500多TB的資料中,單獨分析某個使用者某段時間的行為時,耗費了極大的時間開銷。無論我如何優化算法,都不能達到預期的效果。很顯然,這不符合性能要求。
一名小夥伴對我說:試試C語言嘛。對啊!我為啥不試試用C語言寫算法啊,于是乎,使用C語言寫了算法,經過不斷的優化和調整,算是初步達到了算法性能要求。但是向資料大屏展示資料的時候,後端還是要以微服務的形式部署,于是我想到了Java中的JNI技術
先說說使用JNI時有哪些坑吧,以避免小夥伴們重複踩坑,這裡,大家需要注意的是:在使用JNI技術調用dll動态連結庫時,32位dll隻能是32位JDK去調用,64位dll隻能是64位JDK去調用。這個必須是這樣的,如果發現無法調用或者提示版本錯誤,首先要檢查下JDK的位數和dll的位數是否是對應的。
為了能夠讓小夥伴們順利的按照文章開發出自己的JNI程式,這裡,我就詳細的說下如何開發一個JNI程式,主要分三個大的方面來說明如何使用JNI技術調用C和C++寫的程式。

注意:本文中我使用的是jna Java類庫實作JNI開發。
VS建立項目
輸入項目名稱
選擇空項目,點選完成
建立完成後,将下面這段代碼複制進去:
這裡要注意的是:java的String和cpp的String不一樣的,其對應的是char,如果要用cpp的string不是亂碼就是調用失敗。*
這裡變成Release,點選配置管理器配置x64版本,這樣生成的dll就是x64版本的,這點非常重要。
配置完成以後右擊項目點選生成按鈕。
這一頓操作下來,基本就能夠正确的生成dll了,如果不能生成,極有可能是你的姿勢不對,照着文章重新弄一遍,如果還是不行,你就加我微信問我吧。
VS生成的dll檔案在哪個位置呢?别急,我們繼續。
右擊項目
這裡要注意的是在上級目錄!不要想當然打開的項目位置然後直接就去x64去找了,根本沒用!裡面沒有dll,是在上級目錄,上級目錄 的x64位置。
建立Maven項目後,在Maven的pom檔案中引入如下依賴。
我個人就放在這個lib包下面,這樣導入這個包的時候可以寫絕對路徑也可以寫相對路徑。
注意:這裡定義的接口方法名稱需要和dll中的方法名稱一緻。
直接運作main方法,得到如下輸出結果。
大功告成~~
點選關注,第一時間了解華為雲新鮮技術~