JNI實現Java調用C/C++代碼詳細代碼示例
1. JNI是什么?
JNI(Java Native Interface),是實現Java/Kotlin與C/C++語言之間交互的橋梁。說的更簡單易懂一點,就是java語言和C++語言要想交互的話,必然存在數據類型之間不兼容的問題,這時候必須要有一個中間層去做轉換。
2. JNI 的意義
我們在實際項目開發(fā)中,很多高性能的算法,游戲畫面渲染,音視頻編解碼等方面的程序都是用C/C++開發(fā)的。JNI可以幫助我們實現調用這些C/C++的代碼,也可以實現C/C++代碼調用外部的Java/Kotlin代碼。這樣做到既然滿足Java語言可以快速開發(fā)Java后端或者Android客戶端業(yè)務,也可以滿足底層應用所需要的性能問題。
3. JNI的版本問題說明
JNI存在JDK和NDK兩種版本,JNI最初是存在JDK里面的,后來NDK里面專門對JNI進行了封裝。NDK(Native Development Kit)是Android平臺提供的Native 開發(fā)工具集,所以我們目前開發(fā)Android程序都是采用NDK里面的JNI。
在設置頁面勾選安裝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調用C++程序
在java文件中添加調用函數,函數聲明加上native。將鼠標懸浮,然后點擊 “Creat JNI function xxxx” 就會自動在native-lib.cpp文件中生成JNI的函數


完善native-lib.cpp中的JNI的函數
#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) {
// 這里因為jint和int的類型的范圍是一樣的,所以不需要轉換
Calculator cal;
jint ret = cal.Add(a, b);
return ret;
}4.4 程序測試
java中調用
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);
}運行效果

總結
到此這篇關于JNI實現Java調用C/C++代碼的文章就介紹到這了,更多相關JNI實現Java調用C/C++內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

