偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

我敢說(shuō):99.9%的程序員根本沒(méi)在項(xiàng)目中使用過(guò)Java的這個(gè)功能!

開(kāi)發(fā) 前端
先說(shuō)說(shuō)使用JNI時(shí)有哪些坑吧,以避免小伙伴們重復(fù)踩坑,這里,大家需要注意的是:在使用JNI技術(shù)調(diào)用dll動(dòng)態(tài)鏈接庫(kù)時(shí),32位dll只能是32位JDK去調(diào)用,64位dll只能是64位JDK去調(diào)用。這個(gè)必須是這樣的,如果發(fā)現(xiàn)無(wú)法調(diào)用或者提示版本錯(cuò)誤,首先要檢查下JDK的位數(shù)和dll的位數(shù)是否是對(duì)應(yīng)的。

在Java語(yǔ)言出現(xiàn)之前,很多系統(tǒng)都是使用C和C++開(kāi)發(fā)的。Java出現(xiàn)之后,由于其面向?qū)ο蟮乃枷敫臃先藗兊乃季S習(xí)慣,Java也不用像C和C++那樣需要程序員手動(dòng)管理內(nèi)存的分配和回收。說(shuō)白了,就是簡(jiǎn)單好用。由于Java的諸多優(yōu)點(diǎn),使其一躍霸榜編程語(yǔ)言前排很多年。

為了能夠和使用C和C++寫的程序進(jìn)行交互,Java提供了本地方法的特性,也就是我們常說(shuō)的JNI技術(shù),然而,隨著互聯(lián)網(wǎng)的高速發(fā)展,分布式、微服務(wù)、大數(shù)據(jù)、云計(jì)算等技術(shù)和框架層出不窮,大多數(shù)支持多語(yǔ)言的框架基本上都是都過(guò)RPC或者Restful API進(jìn)行調(diào)用。JNI這項(xiàng)Java中提供的強(qiáng)大功能,卻逐漸的被人遺忘了。

圖片圖片

為何使用JNI

最近,冰河在分析500多TB的數(shù)據(jù),從500多TB的數(shù)據(jù)中分析用戶的行為習(xí)慣,以便為用戶提供更好的產(chǎn)品體驗(yàn)和推薦更加適合用戶的產(chǎn)品。然而,在實(shí)現(xiàn)算法的過(guò)程中,使用Java語(yǔ)言開(kāi)發(fā)的算法從500多TB的數(shù)據(jù)中,單獨(dú)分析某個(gè)用戶某段時(shí)間的行為時(shí),耗費(fèi)了極大的時(shí)間開(kāi)銷。無(wú)論我如何優(yōu)化算法,都不能達(dá)到預(yù)期的效果。很顯然,這不符合性能要求。

一名小伙伴對(duì)我說(shuō):試試C語(yǔ)言嘛。對(duì)啊!我為啥不試試用C語(yǔ)言寫算法啊,于是乎,使用C語(yǔ)言寫了算法,經(jīng)過(guò)不斷的優(yōu)化和調(diào)整,算是初步達(dá)到了算法性能要求。但是向數(shù)據(jù)大屏展示數(shù)據(jù)的時(shí)候,后端還是要以微服務(wù)的形式部署,于是我想到了Java中的JNI技術(shù)

注:后面單獨(dú)寫一篇我是如何分析500多TB數(shù)據(jù)的。

如何使用JNI

先說(shuō)說(shuō)使用JNI時(shí)有哪些坑吧,以避免小伙伴們重復(fù)踩坑,這里,大家需要注意的是:在使用JNI技術(shù)調(diào)用dll動(dòng)態(tài)鏈接庫(kù)時(shí),32位dll只能是32位JDK去調(diào)用,64位dll只能是64位JDK去調(diào)用。這個(gè)必須是這樣的,如果發(fā)現(xiàn)無(wú)法調(diào)用或者提示版本錯(cuò)誤,首先要檢查下JDK的位數(shù)和dll的位數(shù)是否是對(duì)應(yīng)的。

為了能夠讓小伙伴們順利的按照文章開(kāi)發(fā)出自己的JNI程序,這里,我就詳細(xì)的說(shuō)下如何開(kāi)發(fā)一個(gè)JNI程序,主要分三個(gè)大的方面來(lái)說(shuō)明如何使用JNI技術(shù)調(diào)用C和C++寫的程序。

圖片圖片

注意:本文中我使用的是jna Java類庫(kù)實(shí)現(xiàn)JNI開(kāi)發(fā)。

開(kāi)發(fā)dll動(dòng)態(tài)鏈接庫(kù)

使用VS開(kāi)發(fā)dll

VS新建項(xiàng)目

圖片圖片

輸入項(xiàng)目名稱

圖片圖片

選擇空項(xiàng)目,點(diǎn)擊完成

圖片圖片

圖片圖片

圖片圖片

創(chuàng)建完成后,將下面這段代碼復(fù)制進(jìn)去:

#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 ) 
 
//這的參數(shù)是必須的,也可以定義為.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;
}
//定義了一個(gè)返回java String類型的參數(shù)
char * getString(char* a){
 char* b ="this is test";
 return strcat(a,b);
}

這里要注意的是:java的String和cpp的String不一樣的,其對(duì)應(yīng)的是char,如果要用cpp的string不是亂碼就是調(diào)用失敗。

使用VS生成dll

這里變成Release,點(diǎn)擊配置管理器配置x64版本,這樣生成的dll就是x64版本的,這點(diǎn)非常重要。

圖片圖片

圖片圖片

配置完成以后右擊項(xiàng)目點(diǎn)擊生成按鈕。

圖片圖片

這一頓操作下來(lái),基本就能夠正確的生成dll了,如果不能生成,極有可能是你的姿勢(shì)不對(duì),照著文章重新弄一遍,如果還是不行,你就加我微信(hacker_binghe)問(wèn)我吧。

VS生成的dll文件在哪個(gè)位置呢?別急,我們繼續(xù)。

右擊項(xiàng)目

圖片圖片

這里要注意的是在上級(jí)目錄!不要想當(dāng)然打開(kāi)的項(xiàng)目位置然后直接就去x64去找了,根本沒(méi)用!里面沒(méi)有dll,是在上級(jí)目錄,上級(jí)目錄 的x64位置。

圖片圖片

圖片圖片

開(kāi)發(fā)Java程序

導(dǎo)入Maven依賴

新建Maven項(xiàng)目后,在Maven的pom文件中引入如下依賴。

<!-- 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位置

我個(gè)人就放在這個(gè)lib包下面,這樣導(dǎo)入這個(gè)包的時(shí)候可以寫絕對(duì)路徑也可以寫相對(duì)路徑。

編寫代碼

注意:這里定義的接口方法名稱需要和dll中的方法名稱一致。

package com.binghe.jni;
 
import com.sun.jna.Library;
import com.sun.jna.Native;
 
/**
 * @author binghe
 * @description: 測(cè)試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("我現(xiàn)在正在測(cè)試dllgihjb"));
    }
}

運(yùn)行Java程序

直接運(yùn)行main方法,得到如下輸出結(jié)果。

圖片圖片

大功告成~~

責(zé)任編輯:武曉燕 來(lái)源: 冰河技術(shù)
相關(guān)推薦

2025-03-17 07:46:41

2021-03-18 13:58:43

程序員技能開(kāi)發(fā)者

2013-03-28 15:50:37

程序員Java

2009-03-26 09:22:05

2009-06-24 17:34:58

使用JSF的經(jīng)驗(yàn)

2018-09-10 09:18:30

程序員領(lǐng)導(dǎo)加班

2019-10-24 09:29:04

程序員程序員節(jié)女朋友

2019-07-10 09:05:14

程序員開(kāi)源軟件軟件

2012-09-18 10:05:51

程序員我的歌聲里程序員的歌

2024-04-01 00:00:00

Redis緩存服務(wù)消息隊(duì)列

2013-11-29 13:05:07

程序員工作

2015-06-29 09:56:08

2024-06-13 08:50:16

Macshell 工具命令行工具

2019-06-18 14:59:43

程序員編程加班

2021-03-22 08:58:23

程序員產(chǎn)品經(jīng)理

2009-06-02 13:43:04

程序員定義職場(chǎng)

2013-06-08 14:12:13

程序員招聘

2010-03-02 10:13:56

程序員面試

2015-09-01 11:17:53

2012-06-25 10:05:10

程序員
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)