CMake构建工具链中“strip”命令的Android NDK路径变量

shi*_*hen 6 android cmake android-ndk

我想添加一个带调试符号一步为我的Android库,其中包括针对不同的ABI,例如本地共享库x86/native-lib.sox86_64/native-lib.soarm64-v8a/native-lib.so,等。

我知道 strip 命令必须针对每个 ABI。所以,我需要调用正确的strip 命令,为此我需要在构建时知道它的正确路径。

例如,对于 ABI x86_64,我需要进行以下路径设置:

set(STRIP ~/Library/Android/android-ndk-r16b/toolchains/x86_64-4.9/prebuilt/darwin-x86_64/bin/x86_64-linux-android-strip)

add_custom_command(TARGET ${SHARED_LIBRARY_NAME} POST_BUILD
                COMMAND ${STRIP}
                "${DIST_LIBS_DIR}/${LIB_BUILD_TYPE}/${ANDROID_ABI}/lib${SHARED_LIBRARY_NAME}.so"
                COMMENT "Strip debug symbols done on final binary.")
Run Code Online (Sandbox Code Playgroud)

我需要的路径如下图所示: 在此处输入图片说明

所以,我的问题是:

  • 是否有现有的 CMake 变量指向此路径,即/android-ndk-r16b/toolchains/???/prebuilt/???/bin/???-???-???-strip

  • 如果没有,有没有办法,形成利用其他已知的Android CMake的变量此路径,例如ANDROID_NDKANDROID_ABI等?

shi*_*hen 7

非常感谢@Alex Cohn指出android.toolchain.cmake通常存在于~/Library/Android/sdk/cmake/cmake_version_xxx/android.toolchain.cmakemacOS目录中的文件。

里面已经配置了许多有用的Android CMake变量,例如

ANDROID_NDK
ANDROID_TOOLCHAIN
ANDROID_ABI
ANDROID_PLATFORM
ANDROID_STL
ANDROID_PIE
ANDROID_CPP_FEATURES
ANDROID_ALLOW_UNDEFINED_SYMBOLS
ANDROID_ARM_MODE
ANDROID_ARM_NEON
ANDROID_DISABLE_NO_EXECUTE
ANDROID_DISABLE_RELRO
ANDROID_DISABLE_FORMAT_STRING_CHECKS
ANDROID_CCACHE
Run Code Online (Sandbox Code Playgroud)

而这ANDROID_TOOLCHAIN_PREFIX正是我所寻找的,所以我的最终 CMake 脚本如下:

add_custom_command(TARGET ${SHARED_LIBRARY_NAME} POST_BUILD
            COMMAND "${ANDROID_TOOLCHAIN_PREFIX}strip" -g -S -d --strip-debug --verbose
            "${DIST_LIBS_DIR}/${LIB_BUILD_TYPE}/${ANDROID_ABI}/lib${SHARED_LIBRARY_NAME}.so"
            COMMENT "Strip debug symbols done on final binary.")
Run Code Online (Sandbox Code Playgroud)

而且我不需要明确地传递任何额外的参数,即DCMAKE_TOOLCHAIN_FILE=android.toolchain.cmake从命令行到构建过程。因为,这个文件,即android.toolchain.cmake,已经被 Android 原生构建系统自动考虑了。


Ale*_*ohn 5

您可以使用${CMAKE_STRIP}. 当您使用-DCMAKE_TOOLCHAIN_FILE=android.toolchain.cmake时,它会适当设置。我希望如果您使用受支持的 NDK 版本的“内置”Android 支持也可以。