Android 快速入门笔记 (NDK)

Android NDK 支持使用 ndk-build 和 cmake 进行编译

移除不需要的 ABI

build.gradle.kts

android {
    defaultConfig {
        ndk {
            abiFilters += listOf("x86_64")
        }
    }
}

CMake

CMake 变量

ANDROID_HOST_TAG

主机标记 可以用于查找对应主机的工具链

NDK 操作系统变体主机标记
macOSdarwin-x86_64
Linuxlinux-x86_64
64 位 Windowswindows-x86_64
https://developer.android.com/ndk/guides/other_build_systems?hl=zh-cn#overview

CMAKE_C_COMPILER_EXTERNAL_TOOLCHAIN

新的 NDK 删除了这个变量,改用 ANDROID_TOOLCHAIN_ROOT

NDK 工具链路径,不含 /bin,例如 ~/Android/Sdk/ndk/25.1.8937393/toolchains/llvm/prebuilt/linux-x86_64

ANDROID_TOOLCHAIN_ROOT

${CMAKE_ANDROID_NDK}/toolchains/llvm/prebuilt/${ANDROID_HOST_TAG}

NDK 工具链路径,不含 /bin,例如 ~/Android/Sdk/ndk/25.1.8937393/toolchains/llvm/prebuilt/linux-x86_64

集成外部项目

可以使用 CMake ExternalProject 模块集成外部项目,下方有集成 OpenSSL 的例子

集成 OpenSSL

可以通过 CMake 的 ExternalProject 模块添加外部源码进行编译

ExternalProject_Add(openssl_project
        GIT_REPOSITORY https://github.com/openssl/openssl.git
        GIT_TAG ${OPENSSL_VERSION}
        GIT_SHALLOW true
        CONFIGURE_COMMAND ${CMAKE_COMMAND} -E env PATH=${ANDROID_TOOLCHAIN_ROOT}/bin:$ENV{PATH} CC=${CMAKE_C_COMPILER} ANDROID_NDK_ROOT=${ANDROID_NDK} perl <SOURCE_DIR>/Configure android-${ANDROID_ARCH_NAME} -D__ANDROID_API__=${ANDROID_NATIVE_API_LEVEL} --openssldir=${CMAKE_LIBRARY_OUTPUT_DIRECTORY} --libdir="" --prefix=${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
        BUILD_COMMAND ${CMAKE_COMMAND} -E env PATH=${ANDROID_TOOLCHAIN_ROOT}/bin:$ENV{PATH} ANDROID_NDK_ROOT=${ANDROID_NDK} make
        BUILD_BYPRODUCTS ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/libssl.so ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/libcrypto.so
        BUILD_IN_SOURCE true
)
如果想引用本地路径只需要删除 GIT_ 相关行并指定 SOURCE_DIR

也可以通过 Prefab 方式引入,Prefab 可以将 A 项目中的 .so 和 .h 引入到 B项目中

https://gist.github.com/rhulha/3a2bce7dc3d43c4bab8a14a31feecc38

或者手动编译 prebuilt

Windows 编译

不要使用 windows 原生工具链进行ndk编译,可以使用 wsl/msys 方案,推荐 wsl 或原生 Linux 使用 x11 转发 android studio 进行开发。当然也可以进行 prebuilt ,这样可以提高项目编译速度。

https://github.com/openssl/openssl/blob/openssl-3.0.13/Configurations/15-android.conf#L106

# see if there is NDK clang on $PATH, "universal" or "standalone"
            if (which("clang") =~ m|^$ndk/.*/prebuilt/([^/]+)/|) {
                my $host=$1;

其中 which 函数调用的 perl 函数 IPC::Cmd::can_run 在 windows 下会返回反斜杠和8.3文件名,导致正则表达式无法匹配 参考 StackOverflow

暂无评论

发送评论 编辑评论


|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇