目錄
1.什么是JNI??
2.配置JNI開發(fā)環(huán)境NDK
3.創(chuàng)建Native?C++類型的項(xiàng)目
4. 了解CMakeLists.txt 文件
5.了解native-lib.cpp 文件
6.在 Android 的 MainActivity 中調(diào)用 native-lib.cpp 中實(shí)現(xiàn)的本地方法
1.什么是JNI??
? ? ? JNI(Java Native Interface)是一種允許Java代碼與本地代碼(如C或C++)進(jìn)行交互的技術(shù)。它提供了一種機(jī)制,使得Java應(yīng)用程序可以調(diào)用本地方法或庫,并允許本地代碼訪問Java應(yīng)用程序中的對(duì)象和方法。
2.配置JNI開發(fā)環(huán)境NDK
打開Android Studio,點(diǎn)擊“Tools”,轉(zhuǎn)到“SDK Manager”,選擇“SDK Tools”選項(xiàng)卡,并選中“NDK”和“CMake”進(jìn)行安裝。
3.創(chuàng)建Native?C++類型的項(xiàng)目
? ? ? 你可以創(chuàng)建一個(gè) Android 的 Native C++ 項(xiàng)目,并在其中編寫 C++ 代碼,并使用 JNI 接口與 Java 代碼進(jìn)行交互。這樣你就可以充分利用 C++ 的性能優(yōu)勢(shì),并與 Android 平臺(tái)進(jìn)行無縫集成。
其中在 src/main/cpp
目錄下
CMakeLists.txt
文件:該文件是用于配置和管理你的 C++ 代碼構(gòu)建過程的主要文件。
native-lib.cpp
文件:你可以在native-lib.cpp
文件里面來實(shí)現(xiàn)你的 C++ 代碼邏輯。
MainActivity:
中調(diào)用 native-lib.cpp
中實(shí)現(xiàn)的本地方法
4. 了解CMakeLists.txt
文件
CMakeLists.txt 文件是一個(gè)文本文件,用于配置和管理 CMake 構(gòu)建系統(tǒng)的行為。
#cmake最低版本要求
cmake_minimum_required(VERSION 3.22.1)
project("jni_test")
# 配置so庫編譯信息
add_library(
# 輸出so庫的名稱
jni_test
# 設(shè)置生成庫的方式,默認(rèn)為SHARE動(dòng)態(tài)庫
SHARED
# 列出參與編譯的所有源文件
native-lib.cpp)
# 查找代碼中使用到的系統(tǒng)庫
find_library(
log-lib
log)
# 指定編譯目標(biāo)庫時(shí),cmake要鏈接的庫
target_link_libraries(
# 指定目標(biāo)庫,native-lib 是在上面 add_library 中配置的目標(biāo)庫
jni_test
# 列出所有需要鏈接的庫
${log-lib})
常用的命令有:
1.指定 CMake 的最低版本要求。
#cmake最低版本要求
cmake_minimum_required(VERSION 3.22.1)
2.使用 project
命令來指定項(xiàng)目的名稱和版本。
project("jni_test")
3. 通過 set 方法定義了 so 和 頭文件 所在目錄。
set(OPENCV_LIBS_DIR ${CMAKE_SOURCE_DIR}/../opencv_include)
4.引入其他模塊。
include_directories(${OPENCV_LIBS_DIR})
5.添加源文件。
#opencv
add_library(libopencv_java3
SHARED
IMPORTED )
6.set_target_properties
命令可以指定構(gòu)建結(jié)果的輸出路徑、名稱等。
其中ANDROID_ABI 是系統(tǒng)變量,指 向 so 對(duì)應(yīng)的 CPU 框架目錄:armeabi、armeabi-v7a、x86 ...
set_target_properties(libopencv_java3
PROPERTIES IMPORTED_LOCATION
${OPENCV_LIBS}/${ANDROID_ABI}/libopencv_java3.so )
7.??target_link_libraries
命令,你可以指定要鏈接到項(xiàng)目中的靜態(tài)庫或動(dòng)態(tài)庫。
target_link_libraries( jni_test
libopencv_java3
${log-lib}
)
5.了解native-lib.cpp
文件
native-lib.cpp
文件中的內(nèi)容可以根據(jù)你的需求具體編寫,但通常會(huì)包含以下部分:
-
包含頭文件。
#include <jni.h> #include <string>
-
實(shí)現(xiàn)本地方法:在
native-lib.cpp
文件中,你需要實(shí)現(xiàn)在 JNI 接口文件中聲明過的本地方法。這些方法將從 Java 代碼中調(diào)用。
?extern "C" JNIEXPORT jstring JNICALL Java_com_example_jni_1test_MainActivity_stringFromJNI( JNIEnv* env, jobject /* this */) { std::string hello = "Hello from C++"; return env->NewStringUTF(hello.c_str()); }
在上述例子中,我們實(shí)現(xiàn)了一個(gè)名為stringFromJNI 的本地方法,它返回一個(gè)字符串給調(diào)用方。文章來源:http://www.zghlxwxcb.cn/news/detail-677053.html
6.在 Android 的 MainActivity
中調(diào)用 native-lib.cpp
中實(shí)現(xiàn)的本地方法
public class MainActivity extends AppCompatActivity {
static {
System.loadLibrary("jni_test");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//省略
}
public native String stringFromJNI();
}
native-lib.cpp
中的本地方法stringFromJNI ()
在 Java 中以相同的方法名進(jìn)行調(diào)用。文章來源地址http://www.zghlxwxcb.cn/news/detail-677053.html
到了這里,關(guān)于[Android]JNI的基礎(chǔ)知識(shí)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!