一、環(huán)境搭建
1.1 Android studio2021.2.1安裝
到官網(wǎng)下載,此處不再陳述
1.2 JNI安裝
JNI 是JDK里的內(nèi)容,電腦上正確安裝并配置JDK即可。
1.3 NDK安裝
直接在Android studio下載(File---->Settings)
1.4 編譯工具
工具一:AndroidStudio下載安裝cmake(調(diào)試Native時會使用到LLDB,請一同勾選下載安裝)
工具二:用NDK的腳本工具使用ndk-build
二、Native C++項目
2.1 創(chuàng)建項目
新建項目,選擇Native C++,如下圖所示:
2. 2 創(chuàng)建項目后默認的示例代碼
?新建的項目,默認有完整的native示例代碼、cmake的配置
如下所示:
(1)jave代碼
(2)c++代碼
(3)cmake的配置文件CMakeLists
(4) 在app目錄下的build.gradle配置
?(5)編譯后生成的so文件路徑
(6)運行安裝apk的頁面顯示c++方法里面的內(nèi)容
三、cmake的應(yīng)用
創(chuàng)建一個Native C++項目繼續(xù)一下操作。
?3.1 NDK環(huán)境檢查(以win10為例)
(1)給NDK配置環(huán)境變量。
找到NDK在本地的路徑
?把路徑配置到環(huán)境變量中
?(2)給項目配置NDK
File --> Project Structure --> SDK Location,如下圖所示?
注意:若選擇不了NDK路徑,直接在local.properties設(shè)置NDK路徑,效果是一樣的
?3.2 C/C++功能實現(xiàn)
在創(chuàng)建工程后,默認有個寫C++代碼文件native-lib.cpp,在此文件中寫的C++方法可在java中調(diào)用,整個效果如上面的“二? ——> (6)”
3.3 cmake指定輸出so庫文件的輸出路徑
(1)在CMakeLists.txt文件中配置文件的輸出路徑
# 配置庫生成路徑
# CMAKE_CURRENT_SOURCE_DIR是指 cmake庫的源路徑,通常是build/.../cmake/
# /../jniLibs/是指與CMakeList.txt所在目錄的同級目錄:jniLibs (如果沒有會新建)
# ANDROID_ABI 生成庫文件時,采用gradle配置的ABI策略(即:生成哪些平臺對應(yīng)的庫文件)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../jniLibs/${ANDROID_ABI})
(2)在app的build.gradle中配置
sourceSets {
main {
jniLibs.srcDirs = ['jniLibs']//指定lib庫目錄
}
}
(3)點擊狀態(tài)欄的Build ——> Rebuild Project
(4) 查看so庫文件的輸出結(jié)果
?注意:在CMakeLists.txt文件中配置文件的輸出路徑配置了CMAKE_CURRENT_SOURCE_DIR,并非表示編譯時直接將so生成在該目錄中,實際編譯時,so文件仍然是 先生成在build/.../cmake/中,然后再拷貝到目標目錄中的。
3.4 生成指定CPU平臺對應(yīng)的so庫文件
在app下的build.gradle文件下配置,兩種方式都可行,配置后Rebuild Project看最終的運行結(jié)果。如:我只想僅生成CPU是arm64-v8a的so文件。
方式1:cmake中設(shè)置abiFilters?
abiFilters "arm64-v8a"
方式二:?在ndk中設(shè)置abiFilters
ndk {
abiFilters "arm64-v8a"
}
?四、ndk-build的應(yīng)用
創(chuàng)建一個Native C++項目,項目名稱為jniNdkBuild繼續(xù)以下操作
4.1 檢查是否配置了NDK配置環(huán)境變量
打開一個cmd窗口,輸入命令"ndk-build",出現(xiàn)下圖所示,則表示ndk環(huán)境變量配置成功
未配置的可參照上面的“三? 3.1”
4.2 C/C++功能的實現(xiàn)
(1)在app的main目錄下,新建與cpp同級的文件夾jni
(2)拷貝 cpp文件夾下的C++代碼文件native-lib.cpp到j(luò)ni文件下,并重新命名為ndkbuild.cpp,主要是為了跟cmake區(qū)分開庫文件名稱,在MainActivity類中,需要把加載的庫名改成ndkbuild
?(3)調(diào)整ndkbuild.cpp實現(xiàn)方法的文本為“Hello!? I am from C++ ndk-build”,主要是為了與cmake的內(nèi)容區(qū)分開。
?(4)在jni目錄下新建Android.mk文件,并配置以下內(nèi)容
#表示Android.mk所在目錄
LOCAL_PATH := $(call my-dir)
#設(shè)置庫文件的輸入目錄
#輸出目錄 ../jniLibs/
#源目錄 $(TARGET_ARCH_ABI)
NDK_APP_DST_DIR=../jniLibs/$(TARGET_ARCH_ABI)
#CLEAR_VARS變量指向特殊 GNU Makefile,用于清除部分LOCAL_變量
include $(CLEAR_VARS)
#模塊名稱
LOCAL_MODULE := ndkbuild
#構(gòu)建系統(tǒng)用于生成模塊的源文件列表
LOCAL_SRC_FILES := ndkbuild.cpp
#BUILD_SHARED_LIBRARY 表示.so動態(tài)庫
#BUILD_STATIC_LIBRARY 表示.a靜態(tài)庫
include $(BUILD_SHARED_LIBRARY)
?(5)在app目錄下,build.gradle的配置,配置完成后rebuild Project,即可生成對應(yīng)庫文件
在android里面配置
//定義ndkBuild默認配置屬性
externalNativeBuild {
ndkBuild {
cppFlags ""
}
}
//定義ndkBuild對應(yīng)的Android.mk路徑(重要)
externalNativeBuild {
ndkBuild{
path file("src/main/jni/Android.mk")
}
}
配置后如下圖所示:
(6)重新編譯(Rebuild Project),查看so庫文件的輸出效果
?4.3 生成指定CPU平臺對應(yīng)的so庫文件
配置指定CPU類型輸出so庫文件,可有兩種方式實現(xiàn)。例如:我只想生成arm64-v8a。
注意:由于創(chuàng)建的項目默認是cmake配置,需把cmake的配置刪除,換成ndkbuild
方式一:ndkBuild 中設(shè)置abiFilters
//定義ndkBuild默認配置屬性
externalNativeBuild {
ndkBuild {
cppFlags ""
abiFilters "arm64-v8a"
}
}
方式二:?在ndk中設(shè)置abiFilters
ndk {
// 生成指定CPU平臺對應(yīng)的so庫文件
abiFilters "arm64-v8a"
}
?4.4 查看項目運行安裝apk頁面
(1)用ndkbuild編譯方式,則cmake相關(guān)文件可以刪除
?(2)運行安裝apk,頁面顯示native的文本如下圖所示:
注意:如果直接在AS的Terminal或則cmd窗口執(zhí)行了ndk-build命令,則不執(zhí)行g(shù)radle的配置,只會根據(jù)Android.mk進行編譯,編譯生成的CPU的so庫文件是包括所有平臺的。此文章不再演示用命令生成so庫文件,感興趣的可自行百度。
以上demo的下載地址:文章來源:http://www.zghlxwxcb.cn/news/detail-704463.html
https://download.csdn.net/download/zaq977684/87791268文章來源地址http://www.zghlxwxcb.cn/news/detail-704463.html
到了這里,關(guān)于利用android studio 生成 JNI需要的動態(tài)庫so文件 圖文詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!