日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Ubuntu >内容正文

Ubuntu

【Android NDK 开发】NDK 交叉编译 ( Ubuntu 中交叉编译动态库 | Android Studio 中配置使用第三方动态库 )

發(fā)布時間:2025/6/17 Ubuntu 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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 . 函數庫分類 : ① 動態(tài)庫 , ② 靜態(tài)庫 ;


2 . 靜態(tài)庫 :

編譯鏈接時 , 將整個庫文件打包到可執(zhí)行文件中 , 造成可執(zhí)行文件較大 , 但運行時不需要庫文件 ;

Android 與 Linux 靜態(tài)庫 后綴為 “.a” ;


3 . 動態(tài)庫 :

編譯鏈接時 , 不將庫打包入可執(zhí)行文件中 , 在程序運行時調用到該庫時才鏈接加載該動態(tài)庫 ;

Android 與 Linux 靜態(tài)庫 后綴為 “.so” ;


4 . 靜態(tài)庫與動態(tài)庫對比 :

① 靜態(tài)庫時間效率高 : 執(zhí)行時沒有動態(tài)鏈接的操作 , 所有的代碼都在可執(zhí)行文件內部 , 時間消耗少 ;

② 動態(tài)庫空間效率高 : 動態(tài)庫如果被多個程序調用 , 只要有一個動態(tài)庫在內存中即可 ;



II . 編譯動態(tài)庫



1 . 要編譯的源文件 : add.c 源文件 ;

#include <stdio.h>int add(int a, int b){return a + b; }

2 . 共享動態(tài)庫編譯參數 : 編譯動態(tài)庫需要添加 “-fPIC” “-shared” 兩個參數 ;


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


② 設置指定 頭文件和函數庫 的臨時環(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++ 的參數傳給編譯器 # CMAKE_C_FLAGS 表示會將 C 參數傳給編譯器# 參數設置 : 傳遞 CMAKE_CXX_FLAGS C+= 參數給編譯器時 , 在 該參數后面指定庫的路徑 # CMAKE_SOURCE_DIR 指的是當前的文件地址 # -L 參數指定動態(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++ 中調用該庫 :


① 首先聲明該動態(tài)庫中的方法 :

注意 : 這是在 C++ 語言中調用 C 語言方法 , 要使用 extern "C"{} 兼容 C 和 C++ 調用 ;

//調用 libadd.so 動態(tài)庫中的方法 extern "C" { //注意在 C++ 中調用 C 語言方法 , 需要做兼容設置extern int add(int a, int b); }

② 調用動態(tài)庫中的函數 : 之后就可以在該 C++ 文件中任意使用該方法了 ;


5 . 執(zhí)行結果 :

01-25 19:40:27.444 5929-5929/kim.hsl.makeflie I/JNI_TAG: libadd.so : sum = 3

IV . Android Studio 關鍵代碼



1 . CMakeLists.txt 配置文件 :

cmake_minimum_required(VERSION 3.4.1)add_library( # Sets the name of the library.native-lib# Sets the library as a shared library.SHARED# Provides a relative path to your source file(s).native-lib.cpp)# 到預設的目錄查找 log 庫 , 將找到的路徑賦值給 log-lib # 這個路徑是 NDK 的 ndk-bundle\platforms\android-29\arch-arm\usr\lib\liblog.so # 不同的 Android 版本號 和 CPU 架構 需要到對應的目錄中查找 , 此處是 29 版本 32 位 ARM 架構的日志庫 find_library(log-liblog)# 設置變量 # CMAKE_CXX_FLAGS 表示會將 C++ 的參數傳給編譯器 # CMAKE_C_FLAGS 表示會將 C 參數傳給編譯器# 參數設置 : 傳遞 CMAKE_CXX_FLAGS C+= 參數給編譯器時 , 在 該參數后面指定庫的路徑 # CMAKE_SOURCE_DIR 指的是當前的文件地址 # -L 參數指定動態(tài)庫的查找路徑 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/../jniLibs/armeabi-v7a")target_link_libraries(native-lib# 表示要鏈接 libadd.so 動態(tài)庫add${log-lib})

2 . native-lib 本地 C++ 文件 :

#include <jni.h> #include <string>#include <android/log.h>//調用 libadd.so 動態(tài)庫中的方法 extern "C" { //注意在 C++ 中調用 C 語言方法 , 需要做兼容設置extern int add(int a, int b); }extern "C" JNIEXPORT jstring JNICALL Java_kim_hsl_makeflie_MainActivity_stringFromJNI(JNIEnv *env,jobject /* this */) {std::string hello = "Hello from C++";//調用動態(tài)庫中的函數int sum = add(1, 2);//打印計算結果__android_log_print(ANDROID_LOG_INFO, "JNI_TAG", "libadd.so : sum = %d", sum);return env->NewStringUTF(hello.c_str()); }

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 中配置使用第三方动态库 )的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。