JNI實(shí)現(xiàn)Java調(diào)用C/C++代碼詳細(xì)代碼示例
1. JNI是什么?
JNI(Java Native Interface),是實(shí)現(xiàn)Java/Kotlin與C/C++語(yǔ)言之間交互的橋梁。說(shuō)的更簡(jiǎn)單易懂一點(diǎn),就是java語(yǔ)言和C++語(yǔ)言要想交互的話,必然存在數(shù)據(jù)類(lèi)型之間不兼容的問(wèn)題,這時(shí)候必須要有一個(gè)中間層去做轉(zhuǎn)換。
2. JNI 的意義
我們?cè)趯?shí)際項(xiàng)目開(kāi)發(fā)中,很多高性能的算法,游戲畫(huà)面渲染,音視頻編解碼等方面的程序都是用C/C++開(kāi)發(fā)的。JNI可以幫助我們實(shí)現(xiàn)調(diào)用這些C/C++的代碼,也可以實(shí)現(xiàn)C/C++代碼調(diào)用外部的Java/Kotlin代碼。這樣做到既然滿足Java語(yǔ)言可以快速開(kāi)發(fā)Java后端或者Android客戶端業(yè)務(wù),也可以滿足底層應(yīng)用所需要的性能問(wèn)題。
3. JNI的版本問(wèn)題說(shuō)明
JNI存在JDK和NDK兩種版本,JNI最初是存在JDK里面的,后來(lái)NDK里面專(zhuān)門(mén)對(duì)JNI進(jìn)行了封裝。NDK(Native Development Kit)是Android平臺(tái)提供的Native 開(kāi)發(fā)工具集,所以我們目前開(kāi)發(fā)Android程序都是采用NDK里面的JNI。
在設(shè)置頁(yè)面勾選安裝NDK和CMake

4. JNI工程創(chuàng)建
4.1 創(chuàng)建Native C++工程

4.2 在cpp目錄下添加C++文件

Calculator.h
#ifndef JNITEST_CALCULATOR_H
#define JNITEST_CALCULATOR_H
class Calculator {
public:
int Add(int a, int b);
};
#endif //JNITEST_CALCULATOR_HCalculator.cpp
#include "Calculator.h"
int Calculator::Add(int a, int b)
{
return a + b;
}CMakeLists.txt
cmake_minimum_required(VERSION 3.22.1)
project("jnitest")
include_directories(${CMAKE_CURRENT_SOURCE_DIR})
add_library(${CMAKE_PROJECT_NAME} SHARED
native-lib.cpp
Calculator.cpp)
target_link_libraries(${CMAKE_PROJECT_NAME}
android
log)4.3 java調(diào)用C++程序
在java文件中添加調(diào)用函數(shù),函數(shù)聲明加上native。將鼠標(biāo)懸浮,然后點(diǎn)擊 “Creat JNI function xxxx” 就會(huì)自動(dòng)在native-lib.cpp文件中生成JNI的函數(shù)


完善native-lib.cpp中的JNI的函數(shù)
#include <jni.h>
#include <string>
#include "Calculator.h"
extern "C"
JNIEXPORT jint JNICALL
Java_com_cat_jnitest_MainActivity_CplusplusAdd(JNIEnv *env, jobject thiz, jint a, jint b) {
// 這里因?yàn)閖int和int的類(lèi)型的范圍是一樣的,所以不需要轉(zhuǎn)換
Calculator cal;
jint ret = cal.Add(a, b);
return ret;
}4.4 程序測(cè)試
java中調(diào)用
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
TextView tv = binding.sampleText;
String str = "JNI: a + b = ";
int add = CplusplusAdd(100, 200);
str += String.valueOf(add);
tv.setText(str);
}運(yùn)行效果

總結(jié)
到此這篇關(guān)于JNI實(shí)現(xiàn)Java調(diào)用C/C++代碼的文章就介紹到這了,更多相關(guān)JNI實(shí)現(xiàn)Java調(diào)用C/C++內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 安卓應(yīng)用開(kāi)發(fā)通過(guò)java調(diào)用c++ jni的圖文使用方法
- c++ mk文件出錯(cuò)Jni調(diào)用產(chǎn)生java.lang.UnsatisfiedLinkError錯(cuò)誤解決方法
- Android JNI c/c++調(diào)用java的實(shí)例
- JNI實(shí)現(xiàn)最簡(jiǎn)單的JAVA調(diào)用C/C++代碼
- Java通過(guò)調(diào)用C/C++實(shí)現(xiàn)的DLL動(dòng)態(tài)庫(kù)——JNI的方法
- Android使用jni調(diào)用c++/c方法詳解
相關(guān)文章
RocketMQ消息生產(chǎn)者是如何選擇Broker示例詳解
這篇文章主要為大家介紹了RocketMQ消息生產(chǎn)者是如何選擇Broker示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
基于springboot實(shí)現(xiàn)redis分布式鎖的方法
這篇文章主要介紹了基于springboot實(shí)現(xiàn)redis分布式鎖的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
關(guān)于Spring啟動(dòng)時(shí)Context加載源碼分析
這篇文章通過(guò)源碼分析主要給大家介紹了關(guān)于Spring啟動(dòng)時(shí)Context加載的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-01-01
JavaCV攝像頭實(shí)戰(zhàn)之實(shí)現(xiàn)口罩檢測(cè)
這篇文章主要介紹了利用JavaCV實(shí)現(xiàn)口罩檢測(cè),功能是檢測(cè)攝像頭內(nèi)的人是否帶了口罩,把檢測(cè)結(jié)果實(shí)時(shí)標(biāo)注在預(yù)覽窗口。感興趣的可以試一試2022-01-01
Java Mybatis架構(gòu)設(shè)計(jì)深入了解
在本篇文章里小編給大家整理的是一篇關(guān)于Java Mybatis架構(gòu)設(shè)計(jì)詳解內(nèi)容,對(duì)此有興趣的朋友們可以參考下,希望能夠給你帶來(lái)幫助2021-11-11
JavaWeb實(shí)現(xiàn)簡(jiǎn)單查詢商品功能
這篇文章主要為大家詳細(xì)介紹了JavaWeb實(shí)現(xiàn)簡(jiǎn)單查詢商品功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07
Postman實(shí)現(xiàn)傳List<String>集合
這篇文章主要介紹了Postman實(shí)現(xiàn)傳List<String>集合方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
SpringBoot無(wú)法訪問(wèn)webapp目錄下的文件問(wèn)題
這篇文章主要介紹了SpringBoot無(wú)法訪問(wèn)webapp目錄下的文件問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05

