#android #c #android-ndk #cmake
#Android #c #android-ndk #cmake
Вопрос:
В моем проекте CMake я использую android.toolchain.cmake.
Я передаю следующие переменные среды как defines:
export ANDROID_ABI="armeabi-v7a" # x86
export ANDROID_TOOLCHAIN_NAME="arm-linux-androideabi-4.9" # "x86-4.9"
export ANDROID_API_LEVEL="23"
export QT_DIR="$HOME/Qt/5.7/android_armv7"
export ANDROID_STANDALONE_TOOLCHAIN="$HOME/android-ndk-r12b/toolchains/arm-linux-androideabi-4.9/"
export ANDROID_PREFIX="sdk-android-armv7" # sdk-android-x86
export ANDROID_TARGET="armv7" # x86
export QTAV_LIB_DIR="lib_android_arm" # lib_android_x86
Я передаю переменные следующим образом:
cmake -DUSE_COMPRESSED_FILES=1 -DJAVA_HOME="/usr/java/default/" -DANDROID_SDK="$ANDROID_HOME" -DQT_ANDROID_SDK_ROOT="$ANDROID_HOME" -DQT_ANDROID_ANT="$ANT_PATH" -DCMAKE_MODULE_PATH="../cmake" -DCMAKE_PREFIX_PATH="$QT_DIR/lib/cmake" -DCMAKE_TOOLCHAIN_FILE=../cmake/android.toolchain.cmake -DANDROID_NDK="$HOME/android-ndk-r12b" -DCMAKE_BUILD_TYPE=Debug -DANDROID_ABI="$ANDROID_ABI" -DANDROID_TOOLCHAIN_NAME="$ANDROID_TOOLCHAIN_NAME" -DANDROID_STANDALONE_TOOLCHAIN="$ANDROID_STANDALONE_TOOLCHAIN" -DANDROID_NATIVE_API_LEVEL="$ANDROID_API_LEVEL" -DQT_DIR="$QT_DIR" -DANDROID_PREFIX="$ANDROID_PREFIX" -DANDROID_TARGET="$ANDROID_TARGET" -DQTAV_LIB_DIR="$QTAV_LIB_DIR" ../
cmake --build .
Когда «Удаление библиотек для минимизации размера». он говорит:
Command does not exist: /home/peter/android-ndk-r12b/toolchains/armeabi-v7a-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-strip
Путь должен быть «arm-linux-androideabi-4.9», а не «armeabi-v7a-4.9». Почему вместо ANDROID_TOOLCHAIN_NAME используется ANDROID_ABI ?
У меня нет этих проблем для x86:
export ANDROID_ABI="x86"
export ANDROID_TOOLCHAIN_NAME="x86-4.9"
export ANDROID_API_LEVEL="23"
export QT_DIR="$HOME/Qt5.7.0/5.7/android_x86"
export ANDROID_STANDALONE_TOOLCHAIN="$HOME/android-ndk-r12b/toolchains/x86-4.9/"
export ANDROID_PREFIX="sdk-android-x86"
export ANDROID_TARGET="x86"
export QTAV_LIB_DIR="lib_android_x86"
Редактировать:
Команда strip задается файлом android.toolchain.cmake:
set( CMAKE_STRIP "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-strip${TOOL_OS_SUFFIX}" CACHE PATH "strip" )
ANDROID_TOOLCHAIN_ROOT устанавливается таким образом, поскольку я указал путь NDK:
# setup paths and STL for NDK
if( BUILD_WITH_ANDROID_NDK )
set( ANDROID_TOOLCHAIN_ROOT "${ANDROID_NDK_TOOLCHAINS_PATH}/${ANDROID_GCC_TOOLCHAIN_NAME}${ANDROID_NDK_TOOLCHAINS_SUBPATH}" )
итак, я предполагаю, что ANDROID_GCC_TOOLCHAIN_NAME должно быть неправильным? ANDROID_NDK_TOOLCHAINS_SUBPATH начинается с «prebuilded», так что это правильно. ANDROID_NDK_TOOLCHAINS_PATH заканчивается на «toolchains», так что это тоже правильно.
ANDROID_GCC_TOOLCHAIN_NAME устанавливается, если оно не является Clang (а это не так):
set( ANDROID_GCC_TOOLCHAIN_NAME "${ANDROID_TOOLCHAIN_NAME}" )
так что все должно работать нормально, поскольку мое ANDROID_TOOLCHAIN_NAME указано как «arm-linux-androideabi-4.9» выше, но это не так.
правка2:
ANDROID_ABI — это значение, которое используется вместо этого. Насколько я вижу в файле «android.toolchain.cmake», она никогда не используется ни в одном пути к полосе, но ее значение также копируется в ANDROID_NDK_ABI_NAME, который не используется ни для какого пути к полосе.
edit3: это может быть ошибка в AddQtAndroidApk.cmake, а не в toolchain, поскольку вывод фактически:
Stripping libraries to minimize size.
Command does not exist: /home/peter/android-ndk-r12b/toolchains/armeabi-v7a-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-strip
CMakeFiles/my_app_apk.dir/build.make:60: recipe for target 'run_android_deploy_qt' failed
Ответ №1:
Каким-то образом файл qtdeploy.json.in получил НЕПРАВИЛЬНУЮ запись
"toolchain-prefix": "@ANDROID_ABI@",
что не было проблемой для x86. Конечно, это должно быть:
"toolchain-prefix": "@ANDROID_TOOLCHAIN_MACHINE_NAME@",
Кроме того, я удалил параметр инструкции «ANDROID_STANDALONE_TOOLCHAIN», который не является необходимым. Я получил необходимую информацию, используя
cmake -DCMAKE_VERBOSE_MAKEFILE=on ...
make VERBOSE=1
и посмотрите на пакет Qt CMake.