日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

我敢說:99.9%的程序員根本沒在項目中使用過Java的這個功能!

來源: 責編: 時間:2024-02-05 09:32:48 220觀看
導讀在Java語言出現之前,很多系統都是使用C和C++開發的。Java出現之后,由于其面向對象的思想更加符合人們的思維習慣,Java也不用像C和C++那樣需要程序員手動管理內存的分配和回收。說白了,就是簡單好用。由于Java的諸多優點,使

在Java語言出現之前,很多系統都是使用C和C++開發的。Java出現之后,由于其面向對象的思想更加符合人們的思維習慣,Java也不用像C和C++那樣需要程序員手動管理內存的分配和回收。說白了,就是簡單好用。由于Java的諸多優點,使其一躍霸榜編程語言前排很多年。DUU28資訊網——每日最新資訊28at.com

DUU28資訊網——每日最新資訊28at.com

為了能夠和使用C和C++寫的程序進行交互,Java提供了本地方法的特性,也就是我們常說的JNI技術,然而,隨著互聯網的高速發展,分布式、微服務、大數據、云計算等技術和框架層出不窮,大多數支持多語言的框架基本上都是都過RPC或者Restful API進行調用。JNI這項Java中提供的強大功能,卻逐漸的被人遺忘了。DUU28資訊網——每日最新資訊28at.com

圖片圖片DUU28資訊網——每日最新資訊28at.com

為何使用JNI

最近,冰河在分析500多TB的數據,從500多TB的數據中分析用戶的行為習慣,以便為用戶提供更好的產品體驗和推薦更加適合用戶的產品。然而,在實現算法的過程中,使用Java語言開發的算法從500多TB的數據中,單獨分析某個用戶某段時間的行為時,耗費了極大的時間開銷。無論我如何優化算法,都不能達到預期的效果。很顯然,這不符合性能要求。DUU28資訊網——每日最新資訊28at.com

DUU28資訊網——每日最新資訊28at.com

一名小伙伴對我說:試試C語言嘛。對啊!我為啥不試試用C語言寫算法啊,于是乎,使用C語言寫了算法,經過不斷的優化和調整,算是初步達到了算法性能要求。但是向數據大屏展示數據的時候,后端還是要以微服務的形式部署,于是我想到了Java中的JNI技術DUU28資訊網——每日最新資訊28at.com

注:后面單獨寫一篇我是如何分析500多TB數據的。DUU28資訊網——每日最新資訊28at.com

如何使用JNI

先說說使用JNI時有哪些坑吧,以避免小伙伴們重復踩坑,這里,大家需要注意的是:在使用JNI技術調用dll動態鏈接庫時,32位dll只能是32位JDK去調用,64位dll只能是64位JDK去調用。這個必須是這樣的,如果發現無法調用或者提示版本錯誤,首先要檢查下JDK的位數和dll的位數是否是對應的。DUU28資訊網——每日最新資訊28at.com

為了能夠讓小伙伴們順利的按照文章開發出自己的JNI程序,這里,我就詳細的說下如何開發一個JNI程序,主要分三個大的方面來說明如何使用JNI技術調用C和C++寫的程序。DUU28資訊網——每日最新資訊28at.com

圖片圖片DUU28資訊網——每日最新資訊28at.com

注意:本文中我使用的是jna Java類庫實現JNI開發。DUU28資訊網——每日最新資訊28at.com

開發dll動態鏈接庫

使用VS開發dll

VS新建項目

圖片圖片DUU28資訊網——每日最新資訊28at.com

輸入項目名稱

圖片圖片DUU28資訊網——每日最新資訊28at.com

選擇空項目,點擊完成DUU28資訊網——每日最新資訊28at.com

圖片圖片DUU28資訊網——每日最新資訊28at.com

圖片圖片DUU28資訊網——每日最新資訊28at.com

圖片圖片DUU28資訊網——每日最新資訊28at.com

創建完成后,將下面這段代碼復制進去:DUU28資訊網——每日最新資訊28at.com

#include <windows.h> #include <iostream>#include <string>using std::string;using std::cin;using std::cout;using std::endl;  #define MYLIBAPI extern "C" __declspec( dllexport )  //這的參數是必須的,也可以定義為.c頭文件MYLIBAPI double add(double a,double b);MYLIBAPI double mul(double a,double b);MYLIBAPI char * getString(char* a); double add(double a,double b){      return a + b;  } double mul(double a,double b){ return a*b;}//定義了一個返回java String類型的參數char * getString(char* a){ char* b ="this is test"; return strcat(a,b);}

這里要注意的是:java的String和cpp的String不一樣的,其對應的是char,如果要用cpp的string不是亂碼就是調用失敗。DUU28資訊網——每日最新資訊28at.com

使用VS生成dll

這里變成Release,點擊配置管理器配置x64版本,這樣生成的dll就是x64版本的,這點非常重要。DUU28資訊網——每日最新資訊28at.com

圖片圖片DUU28資訊網——每日最新資訊28at.com

DUU28資訊網——每日最新資訊28at.com

圖片圖片DUU28資訊網——每日最新資訊28at.com

配置完成以后右擊項目點擊生成按鈕。DUU28資訊網——每日最新資訊28at.com

圖片圖片DUU28資訊網——每日最新資訊28at.com

這一頓操作下來,基本就能夠正確的生成dll了,如果不能生成,極有可能是你的姿勢不對,照著文章重新弄一遍,如果還是不行,你就加我微信(hacker_binghe)問我吧。DUU28資訊網——每日最新資訊28at.com

VS生成的dll文件在哪個位置呢?別急,我們繼續。DUU28資訊網——每日最新資訊28at.com

右擊項目

圖片圖片DUU28資訊網——每日最新資訊28at.com

這里要注意的是在上級目錄!不要想當然打開的項目位置然后直接就去x64去找了,根本沒用!里面沒有dll,是在上級目錄,上級目錄 的x64位置。DUU28資訊網——每日最新資訊28at.com

圖片DUU28資訊網——每日最新資訊28at.com

DUU28資訊網——每日最新資訊28at.com

圖片DUU28資訊網——每日最新資訊28at.com

DUU28資訊網——每日最新資訊28at.com

開發Java程序

導入Maven依賴

新建Maven項目后,在Maven的pom文件中引入如下依賴。DUU28資訊網——每日最新資訊28at.com

<!-- https://mvnrepository.com/artifact/net.java.dev.jna/jna --><dependency>    <groupId>net.java.dev.jna</groupId>    <artifactId>jna</artifactId>    <version>5.3.1</version></dependency><!-- https://mvnrepository.com/artifact/net.java.dev.jna/jna-platform --><dependency>    <groupId>net.java.dev.jna</groupId>    <artifactId>jna-platform</artifactId>    <version>5.3.1</version></dependency>

指定dll位置

我個人就放在這個lib包下面,這樣導入這個包的時候可以寫絕對路徑也可以寫相對路徑。DUU28資訊網——每日最新資訊28at.com

DUU28資訊網——每日最新資訊28at.com

編寫代碼

注意:這里定義的接口方法名稱需要和dll中的方法名稱一致。DUU28資訊網——每日最新資訊28at.com

package com.binghe.jni; import com.sun.jna.Library;import com.sun.jna.Native; /** * @author binghe * @description: 測試JNI程序 */public class JnaTest {    public interface TestProject extends Library {        TestProject INSTANCE = (TestProject) Native.load("src/main/lib/testDll.dll",                JnaTest.TestProject.class);        public double add(double i, double j);        public double mul(double i, double j);        public String getString(String a);     }     public static void main(String[] args) {         System.out.println(TestProject.INSTANCE.add(20.11,20.0));        System.out.println(TestProject.INSTANCE.mul(16.9,20.89));        System.out.println(TestProject.INSTANCE.getString("我現在正在測試dllgihjb"));    }}

運行Java程序

直接運行main方法,得到如下輸出結果。DUU28資訊網——每日最新資訊28at.com

DUU28資訊網——每日最新資訊28at.com

DUU28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-73794-0.html我敢說:99.9%的程序員根本沒在項目中使用過Java的這個功能!

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 基于Mathlive將數學公式編輯器集成到可視化搭建平臺

下一篇: Vue 10 歲了!你知道它最初的名字嗎?

標簽:
  • 熱門焦點
  • K60至尊版剛預熱 一加Ace2 Pro正面硬剛

    Redmi這邊剛如火如荼的宣傳了K60 Ultra的各種技術和硬件配置,作為競品的一加也坐不住了。一加中國區總裁李杰發布了兩條微博,表示在自家的一加Ace2上早就已經采用了和PixelWo
  • 6月安卓手機性能榜:vivo/iQOO霸占旗艦排行榜前三

    2023年上半年已經正式過去了,我們也迎來了安兔兔V10版本,在新的驍龍8Gen3和天璣9300發布之前,性能榜的榜單大體會以驍龍8Gen2和天璣9200+為主,至于那顆3.36GHz的驍龍8Gen2領先
  • Rust中的高吞吐量流處理

    作者 | Noz編譯 | 王瑞平本篇文章主要介紹了Rust中流處理的概念、方法和優化。作者不僅介紹了流處理的基本概念以及Rust中常用的流處理庫,還使用這些庫實現了一個流處理程序
  • 量化指標是與非:挽救被量化指標扼殺的技術團隊

    作者 | 劉新翠整理 | 徐杰承本文整理自快狗打車技術總監劉新翠在WOT2023大會上的主題分享,更多精彩內容及現場PPT,請關注51CTO技術棧公眾號,發消息【WOT2023PPT】即可直接領取
  • 在線圖片編輯器,支持PSD解析、AI摳圖等

    自從我上次分享一個人開發仿造稿定設計的圖片編輯器到現在,不知不覺已過去一年時間了,期間我經歷了裁員失業、面試找工作碰壁,寒冬下一直沒有很好地履行計劃.....這些就放在日
  • 三萬字盤點 Spring 九大核心基礎功能

    大家好,我是三友~~今天來跟大家聊一聊Spring的9大核心基礎功能。話不多說,先上目錄:圖片友情提示,本文過長,建議收藏,嘿嘿嘿!一、資源管理資源管理是Spring的一個核心的基礎功能,不
  • JVM優化:實戰OutOfMemoryError異常

    一、Java堆溢出堆內存中主要存放對象、數組等,只要不斷地創建這些對象,并且保證 GC Roots 到對象之間有可達路徑來避免垃 圾收集回收機制清除這些對象,當這些對象所占空間超過
  • 郭明錤稱華為和江淮汽車合作開發問界MPV,定價100萬左右、計劃明年量產

    8 月 1 日消息,郭明錤今天在 Medium 平臺發布博文,稱華為正在和江淮汽車合作,開發售價在 100 萬元的問界 MPV,預計在 2024 年第 2 季度量產,銷量目標為
  • 由于成本持續增加,筆記本產品價格預計將明顯上漲

    根據知情人士透露,由于材料、物流等成本持續增加,筆記本產品價格預計將在2021年下半年有明顯上漲。進入6月下旬以來,全球半導體芯片缺貨情況加劇,顯卡、處理器
Top 主站蜘蛛池模板: 邯郸县| 汝城县| 尉氏县| 济源市| 博客| 敖汉旗| 富平县| 姜堰市| 深州市| 甘孜| 和龙市| 高尔夫| 六枝特区| 京山县| 石门县| 临颍县| 疏附县| 靖安县| 洛隆县| 共和县| 靖远县| 鄂州市| 乐昌市| 宿松县| 长葛市| 婺源县| 青浦区| 西吉县| 息烽县| 林州市| 开鲁县| 潮安县| 伊川县| 南郑县| 临海市| 赣州市| 临城县| 毕节市| 方城县| 舟山市| 招远市|