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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

【Android NDK 开发】Android Studio 的 NDK 配置 ( 源码编译配置 | 构建脚本配置 | 打包配置 | CMake 配置 | ndkBuild 配置 )

發(fā)布時(shí)間:2025/6/17 Android 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Android NDK 开发】Android Studio 的 NDK 配置 ( 源码编译配置 | 构建脚本配置 | 打包配置 | CMake 配置 | ndkBuild 配置 ) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

        • I . 源碼編譯配置
        • II . 構(gòu)建腳本配置
        • III . NDK 函數(shù)庫打包配置
        • IV . Java 與 C 代碼示例
        • V . CMake 配置 ( CMakeLists.txt )
        • VI . ndkBuild 配置 ( Android.mk )
        • VII . 博客相關(guān)資源下載



I . 源碼編譯配置



1 . 源碼編譯配置 :


① 配置位置 : Module 級(jí)別的 build.gradle 中進(jìn)行配置 ;

② 主要作用 : 主要作用是配置本工程中的 C/C++ 源碼如何編譯成動(dòng)態(tài)庫的 ;

③ 常用配置 : 一般配置將源碼編譯成哪幾個(gè) CPU 的指令集 ;

目前只支持 armeabi-v7a , arm64-v8a , x86 , x86-64 四種 CPU 指令集架構(gòu) ;


2 . 配置層級(jí) : 在 android 下 defaultConfig 中配置的 externalNativeBuild 是配置 AS 中的 C/C++ 源碼編譯內(nèi)容的 ;


注意區(qū)分配置 : externalNativeBuild 有兩種類型的配置 , 一種在 defaultConfig 內(nèi)部 , 一種在 defaultConfig 外部 ;


① defaultConfig 內(nèi)部的 externalNativeBuild : 配置的是配置 AS 工程的 C/C++ 源文件編譯參數(shù)

② defaultConfig 外部的 externalNativeBuild : 配置的是 CMakeList.txt 或 Android.mk 構(gòu)建腳本的路徑


2 . 配置腳本示例 ( 省略無關(guān)內(nèi)容 ) :

apply plugin: 'com.android.application'android {...defaultConfig {.../*關(guān)于 CPU 指令集NDK 17 以上只支持 armeabi-v7a, arm64-v8a, x86, x86-64 四種 CPU 架構(gòu)*/// 配置 AS 工程中的 C/C++ 源文件的編譯// defaultConfig 內(nèi)部的 externalNativeBuild 配置的是配置 AS 工程的 C/C++ 源文件編譯參數(shù)// defaultConfig 外部的 externalNativeBuild 配置的是 CMakeList.txt 或 Android.mk 構(gòu)建腳本的路徑externalNativeBuild {cmake {cppFlags ""//配置編譯 C/C++ 源文件為哪幾個(gè) CPU 指令集的函數(shù)庫 (arm , x86 等)abiFilters "armeabi-v7a" , "arm64-v8a", "x86", "x86_64"}}...}... }

II . 構(gòu)建腳本配置



1 . 構(gòu)建腳本配置 :


① 配置位置 : Module 級(jí)別的 build.gradle 中進(jìn)行配置 ;

② 主要作用 : 主要作用是配置本工程中的 C/C++ 源碼的構(gòu)建腳本 ;

③ 常用配置 : 配置 cmake 或 ndkBuild 兩種編譯腳本中的一種 ( 只能二選一 ) ;


2 . cmake 配置 : 配置使用 CMake 編譯 C/C++ 時(shí)的構(gòu)建腳本 CMakeList.txt 路徑 ;


① cmake 簡介 : 使用 CMake 進(jìn)行構(gòu)建 , 構(gòu)建腳本是 CMakeList.txt , 是 Android Studio 中新引入的 NDK 本地代碼構(gòu)建方式 ;

② 路徑設(shè)置 : 路徑的起點(diǎn)就是 build.gradle 文件所在的目錄 , 即 app 目錄 ;

② 配置示例 :

externalNativeBuild {cmake {path "src/main/cpp/CMakeLists.txt"version "3.10.2"}

3 . ndkBuild 配置 : 配置使用 ndkBuild 編譯 C/C++ 時(shí)的構(gòu)建腳本 Android.mk 路徑 ;


① ndkBuild 簡介 : 使用 ndkBuild 進(jìn)行構(gòu)建 , 構(gòu)建腳本是 Android.mk , 是從 Eclipse + ADT 環(huán)境遺留下來的配置 NDK 編譯方案 , 逐步被 CMake 替代 ;

② 路徑設(shè)置 : 路徑的起點(diǎn)就是 build.gradle 文件所在的目錄 , 即 app 目錄 ;

② 配置示例 :

externalNativeBuild {ndkBuild{path "src/main/cpp/Android.mk"}

3 . 配置層級(jí) : 在 android 與 defaultConfig 平級(jí)的 externalNativeBuild 是配置 AS 中的 C/C++ 源碼編譯構(gòu)建腳本的 ;


注意區(qū)分配置 : externalNativeBuild 有兩種類型的配置 , 一種在 defaultConfig 內(nèi)部 , 一種在 defaultConfig 外部與之平級(jí)的配置 ;


① defaultConfig 內(nèi)部的 externalNativeBuild : 配置的是配置 AS 工程的 C/C++ 源文件編譯參數(shù)

② defaultConfig 外部的 externalNativeBuild : 配置的是 CMakeList.txt 或 Android.mk 構(gòu)建腳本的路徑


4 . 配置腳本示例 ( 省略無關(guān)內(nèi)容 ) :

apply plugin: 'com.android.application'android {...defaultConfig {...}// 配置 NDK 的編譯腳本路徑// 編譯腳本有兩種 ① CMakeList.txt ② Android.mk// defaultConfig 內(nèi)部的 externalNativeBuild 配置的是配置 AS 工程的 C/C++ 源文件編譯參數(shù)// defaultConfig 外部的 externalNativeBuild 配置的是 CMakeList.txt 或 Android.mk 構(gòu)建腳本的路徑externalNativeBuild {// 配置 CMake 構(gòu)建腳本 CMakeLists.txt 腳本路徑// 使用該配置時(shí) , 將 ndkBuild 配置注釋掉cmake {path "src/main/cpp/CMakeLists.txt"version "3.10.2"}// 配置 Android.mk 構(gòu)建腳本路徑// 使用該配置時(shí) , 將 cmake 配置注釋掉/*ndkBuild{path "src/main/cpp/Android.mk"}*/}... } ...

III . NDK 函數(shù)庫打包配置



1 . 構(gòu)建腳本配置 :


① 配置位置 : Module 級(jí)別的 build.gradle 中進(jìn)行配置 ;

② 主要作用 : 主要作用是配置 APK 打包動(dòng)態(tài)庫的相關(guān)參數(shù) ; 如在工程中編譯的函數(shù)庫 , 其提供了 arm, x86, mips 等指令集的動(dòng)態(tài)庫 , 那么為了控制打包后的應(yīng)用大小, 可以選擇性打包一些庫 , 此處就是進(jìn)行該配置 ;

③ 常用配置 : 配置 cmake 或 ndkBuild 兩種編譯腳本中的一種 ( 只能二選一 ) ;


2 . 配置腳本示例 ( 省略無關(guān)內(nèi)容 ) :

apply plugin: 'com.android.application'android {...defaultConfig {.../*關(guān)于 CPU 指令集NDK 17 以上只支持 armeabi-v7a, arm64-v8a, x86, x86-64 四種 CPU 架構(gòu)*///配置 APK 打包 哪些動(dòng)態(tài)庫// 示例 : 如在工程中編譯的函數(shù)庫 , 其提供了 arm, x86, mips 等指令集的動(dòng)態(tài)庫// 那么為了控制打包后的應(yīng)用大小, 可以選擇性打包一些庫 , 此處就是進(jìn)行該配置ndk{// 打包生成的 APK 文件指揮包含 ARM 指令集的動(dòng)態(tài)庫abiFilters "armeabi-v7a" , "arm64-v8a", "x86", "x86_64"}...}... }

IV . Java 與 C 代碼示例



1 . Java 代碼 :

package kim.hsl.compile;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle; import android.widget.TextView;public class MainActivity extends AppCompatActivity {static {//此處只能加載動(dòng)態(tài)庫 , 不能加載靜態(tài)庫System.loadLibrary("native-lib");}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);TextView tv = findViewById(R.id.sample_text);tv.setText(stringFromJNI());}public native String stringFromJNI();}

2 . C 代碼 :

#include <jni.h> #include <android/log.h>JNIEXPORT jstring JNICALL Java_kim_hsl_compile_MainActivity_stringFromJNI(JNIEnv *env,jobject obj) {__android_log_print(ANDROID_LOG_INFO, "JNI_TAG", "Hello from C");return (*env)->NewStringUTF(env, "Hello from C"); }

V . CMake 配置 ( CMakeLists.txt )



1 . CMakeLists.txt 配置示例 :

# 聲明 CMake 版本 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.c)# 到預(yù)設(shè)的目錄查找 log 庫 , 將找到的路徑賦值給 log-lib # 這個(gè)路徑是 NDK 的 ndk-bundle\platforms\android-29\arch-arm\usr\lib\liblog.so # 不同的 Android 版本號(hào) 和 CPU 架構(gòu) 需要到對(duì)應(yīng)的目錄中查找 , 此處是 29 版本 32 位 ARM 架構(gòu)的日志庫 find_library(log-liblog)# 鏈接庫 target_link_libraries(native-lib${log-lib})

2 . 對(duì)應(yīng)的 build.gradle 中的 NDK 配置 :

apply plugin: 'com.android.application'android {.../*關(guān)于 CPU 指令集NDK 17 以上只支持 armeabi-v7a, arm64-v8a, x86, x86-64 四種 CPU 指令集架構(gòu)*/// 配置 AS 工程中的 C/C++ 源文件的編譯// defaultConfig 內(nèi)部的 externalNativeBuild 配置的是配置 AS 工程的 C/C++ 源文件編譯參數(shù)// defaultConfig 外部的 externalNativeBuild 配置的是 CMakeList.txt 或 Android.mk 構(gòu)建腳本的路徑externalNativeBuild {cmake {cppFlags ""//配置編譯 C/C++ 源文件為哪幾個(gè) CPU 指令集的函數(shù)庫 (arm , x86 等)abiFilters "armeabi-v7a" , "arm64-v8a", "x86", "x86_64"}}//配置 APK 打包 哪些動(dòng)態(tài)庫// 示例 : 如在工程中編譯的函數(shù)庫 , 其提供了 arm, x86, mips 等指令集的動(dòng)態(tài)庫// 那么為了控制打包后的應(yīng)用大小, 可以選擇性打包一些庫 , 此處就是進(jìn)行該配置ndk{// 打包生成的 APK 文件指揮包含 ARM 指令集的動(dòng)態(tài)庫abiFilters "armeabi-v7a" , "arm64-v8a", "x86", "x86_64"}}// 配置 NDK 的編譯腳本路徑// 編譯腳本有兩種 ① CMakeList.txt ② Android.mk// defaultConfig 內(nèi)部的 externalNativeBuild 配置的是配置 AS 工程的 C/C++ 源文件編譯參數(shù)// defaultConfig 外部的 externalNativeBuild 配置的是 CMakeList.txt 或 Android.mk 構(gòu)建腳本的路徑externalNativeBuild {// 配置 CMake 構(gòu)建腳本 CMakeLists.txt 腳本路徑// 使用該配置時(shí) , 將 ndkBuild 配置注釋掉cmake {path "src/main/cpp/CMakeLists.txt"version "3.10.2"}// 配置 Android.mk 構(gòu)建腳本路徑// 使用該配置時(shí) , 將 cmake 配置注釋掉/*ndkBuild{path "src/main/cpp/Android.mk"}*/}... } ...

VI . ndkBuild 配置 ( Android.mk )



1 . Android.mk 配置示例 :

# my-dir 是 NDK 內(nèi)置的函數(shù) , 獲取當(dāng)前的目錄路徑 # 在該案例中就是 Android.mk 文件所在的目錄的絕對(duì)路徑 , 工程根目錄/app/src/main/cpp # 將該目錄賦值給 LOCAL_PATH 變量 # 所有的 Android.mk 的第一行配置都是該語句LOCAL_PATH := $(call my-dir)# 打印 LOCAL_PATH 值 # Build 打印內(nèi)容 : LOCAL_PATH : Y:/002_WorkSpace/001_AS/005_NDK_Compile/app/src/main/cpp # 編譯 APK 時(shí)會(huì)在 Build 中打印$(info LOCAL_PATH : $(LOCAL_PATH))# 配置新的模塊之前都要先清除 LOCAL_XXX 變量 # LOCAL_PATH 變量會(huì)保留include $(CLEAR_VARS)# 配置動(dòng)態(tài)庫名稱 # 動(dòng)態(tài)庫命名規(guī)則 : 在 LOCAL_MODULE 基礎(chǔ)上 , 添加 lib 前綴 和 .so 后綴 # 生成動(dòng)態(tài)庫名稱 : libnative-lib.soLOCAL_MODULE := native-lib# 編譯的源文件LOCAL_SRC_FILES := native-lib.c# 配置構(gòu)建的目標(biāo)是動(dòng)態(tài)庫include $(BUILD_SHARED_LIBRARY)

2 . 對(duì)應(yīng)的 build.gradle 中的 NDK 配置 :

apply plugin: 'com.android.application'android {.../*關(guān)于 CPU 指令集NDK 17 以上只支持 armeabi-v7a, arm64-v8a, x86, x86-64 四種 CPU 指令集架構(gòu)*/// 配置 AS 工程中的 C/C++ 源文件的編譯// defaultConfig 內(nèi)部的 externalNativeBuild 配置的是配置 AS 工程的 C/C++ 源文件編譯參數(shù)// defaultConfig 外部的 externalNativeBuild 配置的是 CMakeList.txt 或 Android.mk 構(gòu)建腳本的路徑externalNativeBuild {cmake {cppFlags ""//配置編譯 C/C++ 源文件為哪幾個(gè) CPU 指令集的函數(shù)庫 (arm , x86 等)abiFilters "armeabi-v7a" , "arm64-v8a", "x86", "x86_64"}}//配置 APK 打包 哪些動(dòng)態(tài)庫// 示例 : 如在工程中編譯的函數(shù)庫 , 其提供了 arm, x86, mips 等指令集的動(dòng)態(tài)庫// 那么為了控制打包后的應(yīng)用大小, 可以選擇性打包一些庫 , 此處就是進(jìn)行該配置ndk{// 打包生成的 APK 文件指揮包含 ARM 指令集的動(dòng)態(tài)庫abiFilters "armeabi-v7a" , "arm64-v8a", "x86", "x86_64"}}// 配置 NDK 的編譯腳本路徑// 編譯腳本有兩種 ① CMakeList.txt ② Android.mk// defaultConfig 內(nèi)部的 externalNativeBuild 配置的是配置 AS 工程的 C/C++ 源文件編譯參數(shù)// defaultConfig 外部的 externalNativeBuild 配置的是 CMakeList.txt 或 Android.mk 構(gòu)建腳本的路徑externalNativeBuild {// 配置 CMake 構(gòu)建腳本 CMakeLists.txt 腳本路徑// 使用該配置時(shí) , 將 ndkBuild 配置注釋掉/*cmake {path "src/main/cpp/CMakeLists.txt"version "3.10.2"}*/// 配置 Android.mk 構(gòu)建腳本路徑// 使用該配置時(shí) , 將 cmake 配置注釋掉ndkBuild{path "src/main/cpp/Android.mk"}}... } ...

VII . 博客相關(guān)資源下載



CSDN 博客地址 : 【Android NDK 開發(fā)】Android Studio 的 NDK 配置 ( 源碼編譯配置 | 構(gòu)建腳本配置 | 打包配置 | CMake 配置 | ndkBuild 配置 )

博客資源下載地址 : https://download.csdn.net/download/han1202012/12152060

示例代碼 GitHub 地址 : https://github.com/han1202012/005_NDK_Compile

總結(jié)

以上是生活随笔為你收集整理的【Android NDK 开发】Android Studio 的 NDK 配置 ( 源码编译配置 | 构建脚本配置 | 打包配置 | CMake 配置 | ndkBuild 配置 )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。