【Android NDK 开发】NDK 交叉编译 ( Ubuntu 中交叉编译动态库 | Android Studio 中配置使用第三方动态库 )
文章目錄
- I . 動態(tài)庫 與 靜態(tài)庫
- II . 編譯動態(tài)庫
- III. Android Studio 使用第三方動態(tài)庫
- IV . Android Studio 關鍵代碼
- V . 博客資源
I . 動態(tài)庫 與 靜態(tài)庫
1 . 函數(shù)庫分類 : ① 動態(tài)庫 , ② 靜態(tài)庫 ;
2 . 靜態(tài)庫 :
編譯鏈接時 , 將整個庫文件打包到可執(zhí)行文件中 , 造成可執(zhí)行文件較大 , 但運行時不需要庫文件 ;
Android 與 Linux 靜態(tài)庫 后綴為 “.a” ;
3 . 動態(tài)庫 :
編譯鏈接時 , 不將庫打包入可執(zhí)行文件中 , 在程序運行時調(diào)用到該庫時才鏈接加載該動態(tài)庫 ;
Android 與 Linux 靜態(tài)庫 后綴為 “.so” ;
4 . 靜態(tài)庫與動態(tài)庫對比 :
① 靜態(tài)庫時間效率高 : 執(zhí)行時沒有動態(tài)鏈接的操作 , 所有的代碼都在可執(zhí)行文件內(nèi)部 , 時間消耗少 ;
② 動態(tài)庫空間效率高 : 動態(tài)庫如果被多個程序調(diào)用 , 只要有一個動態(tài)庫在內(nèi)存中即可 ;
II . 編譯動態(tài)庫
1 . 要編譯的源文件 : add.c 源文件 ;
#include <stdio.h>int add(int a, int b){return a + b; }2 . 共享動態(tài)庫編譯參數(shù) : 編譯動態(tài)庫需要添加 “-fPIC” 和 “-shared” 兩個參數(shù) ;
3 . 編譯命令 :
① 設置 編譯器 臨時環(huán)境變量 :
export CC=/home/book/NDK/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc
② 設置指定 頭文件和函數(shù)庫 的臨時環(huán)境變量 :
export HEAD_LIB="--sysroot=/home/book/NDK/android-ndk-r17c/platforms/android-21/arch-arm -isystem /home/book/NDK/android-ndk-r17c/sysroot/usr/include -isystem /home/book/NDK/android-ndk-r17c/sysroot/usr/include/arm-linux-androideabi"
③ 最終命令 :
$CC $HEAD_LIB -fPIC -shared add.c -o libadd.so
4 . 編譯結果 : 在該目錄下生成了 libadd.so 動態(tài)庫 ;
book@book-virtual-machine:~/NDK$ export CC=/home/book/NDK/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc book@book-virtual-machine:~/NDK$ export HEAD_LIB="--sysroot=/home/book/NDK/android-ndk-r17c/platforms/android-21/arch-arm -isystem /home/book/NDK/android-ndk-r17c/sysroot/usr/include -isystem /home/book/NDK/android-ndk-r17c/sysroot/usr/include/arm-linux-androideabi" book@book-virtual-machine:~/NDK$ $CC $HEAD_LIB -fPIC -shared add.c -o libadd.so book@book-virtual-machine:~/NDK$ ls add.c android-ndk-r17c-linux-x86_64.zip libadd.so android-ndk-r17c a.out main.c book@book-virtual-machine:~/NDK$目錄中的 libadd.so 就是編譯完成的動態(tài)庫 , 該動態(tài)庫可以放到 Android Studio 項目中使用 ;
III. Android Studio 使用第三方動態(tài)庫
1 . 拷貝動態(tài)庫 :
在 AS 項目的 main 目錄下 , 創(chuàng)建 jniLibs/armeabi-v7a 目錄 , 將 libadd.so 拷貝到該目錄中 ;
2 . CMakeLists.txt 中配置動態(tài)庫 :
配置示例 :
# 設置變量 # CMAKE_CXX_FLAGS 表示會將 C++ 的參數(shù)傳給編譯器 # CMAKE_C_FLAGS 表示會將 C 參數(shù)傳給編譯器# 參數(shù)設置 : 傳遞 CMAKE_CXX_FLAGS C+= 參數(shù)給編譯器時 , 在 該參數(shù)后面指定庫的路徑 # CMAKE_SOURCE_DIR 指的是當前的文件地址 # -L 參數(shù)指定動態(tài)庫的查找路徑 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/../jniLibs/armeabi-v7a")3 . Module 級別的 build.gradle 中配置動態(tài)庫 :
在 android -> defaultConfig -> externalNativeBuild -> cmake 下添加 abiFilters "armeabi-v7a" 配置 ;
defaultConfig {...externalNativeBuild {cmake {cppFlags ""abiFilters "armeabi-v7a"}}}4 . 在 C++ 中調(diào)用該庫 :
① 首先聲明該動態(tài)庫中的方法 :
注意 : 這是在 C++ 語言中調(diào)用 C 語言方法 , 要使用 extern "C"{} 兼容 C 和 C++ 調(diào)用 ;
//調(diào)用 libadd.so 動態(tài)庫中的方法 extern "C" { //注意在 C++ 中調(diào)用 C 語言方法 , 需要做兼容設置extern int add(int a, int b); }② 調(diào)用動態(tài)庫中的函數(shù) : 之后就可以在該 C++ 文件中任意使用該方法了 ;
5 . 執(zhí)行結果 :
01-25 19:40:27.444 5929-5929/kim.hsl.makeflie I/JNI_TAG: libadd.so : sum = 3IV . Android Studio 關鍵代碼
1 . CMakeLists.txt 配置文件 :
2 . native-lib 本地 C++ 文件 :
3 . Module 級別的 build.gradle 配置文件 :
apply plugin: 'com.android.application'android {compileSdkVersion 29buildToolsVersion "29.0.0"defaultConfig {applicationId "kim.hsl.makeflie"minSdkVersion 15targetSdkVersion 29versionCode 1versionName "1.0"testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"externalNativeBuild {cmake {cppFlags ""abiFilters "armeabi-v7a"}}}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}}externalNativeBuild {cmake {path "src/main/cpp/CMakeLists.txt"version "3.10.2"}} }dependencies {implementation fileTree(dir: 'libs', include: ['*.jar'])implementation 'androidx.appcompat:appcompat:1.1.0'implementation 'androidx.constraintlayout:constraintlayout:1.1.3'testImplementation 'junit:junit:4.12'androidTestImplementation 'androidx.test:runner:1.2.0'androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' }V . 博客資源
CSDN 博客地址 : 【Android NDK 開發(fā)】NDK 交叉編譯 ( Ubuntu 中交叉編譯動態(tài)庫 | Android Studio 中配置使用第三方動態(tài)庫 )
博客資源下載地址 : https://download.csdn.net/download/han1202012/12148685
示例代碼 GitHub 地址 : https://github.com/han1202012/004_NDK_Makeflie
總結
以上是生活随笔為你收集整理的【Android NDK 开发】NDK 交叉编译 ( Ubuntu 中交叉编译动态库 | Android Studio 中配置使用第三方动态库 )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android NDK 开发】NDK
- 下一篇: 【Android NDK 开发】Andr