简体   繁体   中英

Android NDK path variable for “strip” command in CMake build tool chain

I am trying to add a strip debug symbols step for my Android library which includes native shared libraries for different ABIs, eg x86/native-lib.so , x86_64/native-lib.so , arm64-v8a/native-lib.so , etc.

I understand that the strip command must be respective to each ABI . So, I need to invoke the correct strip command , for which I need to know its correct path during build time.

For example, for ABI x86_64 , I need to have below path setting:

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.")

The path I need is illustrated like below: 在此输入图像描述

So, my questions are:

  • Is there an existing CMake variable to point at this path, ie /android-ndk-r16b/toolchains/???/prebuilt/???/bin/???-???-???-strip ?

  • If not, is there a way to form this path utilising other known Android CMake variable, eg ANDROID_NDK , ANDROID_ABI , etc?

You can use ${CMAKE_STRIP} . It is set appropriately when you use the -DCMAKE_TOOLCHAIN_FILE=android.toolchain.cmake . I hope it is OK also if you work with 'built-in' Android support with supported NDK version.

Thanks @Alex Cohn a lot for pointing out the file android.toolchain.cmake which usually exists at directory ~/Library/Android/sdk/cmake/cmake_version_xxx/android.toolchain.cmake on macOS.

There are many useful Android CMake variables already configured inside, eg

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

And the one ANDROID_TOOLCHAIN_PREFIX is exactly what I looked for, so my final CMake script comes into below:

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.")

And I don't need to explicitly pass any additional arguments, ie DCMAKE_TOOLCHAIN_FILE=android.toolchain.cmake , from command line to the build process. Because, this file, ie android.toolchain.cmake , was already taken into account automatically by Android native build system.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM