#!/bin/bash
path_current=`pwd`
path_script=$(cd "$(dirname "$0")"; pwd)
DEFAULT_PATH=$PATH
ANDROID_NDK_HOME=~/Android/Sdk/ndk/20.1.5948944
declare -A qt_architectures=( ["x86_64"]="x86_64" ["x86"]="x86" ["arm64"]="arm64-v8a" ["arm"]="armeabi-v7a" )
rm -rf android
if [ ! -d "${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/bin" ]; then
echo "failed to find linux-x86_64 home. please install ndk-r20+ version in ubuntu-18.04 system"
exit 1
fi
ANDROID_TOOLCHAIN="${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/bin"
for arch in ${!qt_architectures[@]}
do
case $arch in
arm)
ANDROID_API=16
;;
x86)
ANDROID_API=16
;;
arm64)
ANDROID_API=21
;;
x86_64)
ANDROID_API=21
;;
esac
rm -rf ${path_script}/build
ANDROID_DEFINITION="-DCMAKE_FIND_ROOT_PATH:PATH=${path_script}/../openssl/android/${arch};${path_script}/../zlib/android/${arch}"
ANDROID_DEFINITION="${ANDROID_DEFINITION} -DWITH_EXAMPLES=OFF"
ANDROID_DEFINITION="${ANDROID_DEFINITION} -DCMAKE_BUILD_TYPE:STRING=Release"
ANDROID_DEFINITION="${ANDROID_DEFINITION} -DANDROID_ABI:STRING=${qt_architectures[$arch]}"
ANDROID_DEFINITION="${ANDROID_DEFINITION} -DANDROID_NATIVE_API_LEVEL:STRING=${ANDROID_API}"
ANDROID_DEFINITION="${ANDROID_DEFINITION} -DANDROID_NDK:PATH=${ANDROID_NDK_HOME}"
ANDROID_DEFINITION="${ANDROID_DEFINITION} -DCMAKE_CXX_COMPILER:STRING=${ANDROID_TOOLCHAIN}/clang++"
ANDROID_DEFINITION="${ANDROID_DEFINITION} -DCMAKE_C_COMPILER:STRING=${ANDROID_TOOLCHAIN}/clang"
ANDROID_DEFINITION="${ANDROID_DEFINITION} -DCMAKE_TOOLCHAIN_FILE:PATH=${ANDROID_NDK_HOME}/build/cmake/android.toolchain.cmake"
mkdir -p ${path_script}/build && cd ${path_script}/build && cmake -DCMAKE_C_FLAGS="-fPIC -Wall" -DCMAKE_INSTALL_PREFIX=${path_script}/android/${arch} ${ANDROID_DEFINITION} ../libssh-0.9.3
make clean && make && make install
done
月度归档:2020年05月
Android添加第三方库
if(ANDROID)
# the follow VARIABLE must be written before find_package or it will be no effective.
# must add CACHE INTERNAL parameter. or it will failed.
message("add the third so library to project")
#set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android" CACHE INTERNAL "")
set(ANDROID_EXTRA_LIBS "${LIBSSH_SOURCE_PATH}/lib/libssh.so" CACHE INTERNAL "")
message("ANDROID_EXTRA_LIBS=${ANDROID_EXTRA_LIBS}")
endif()
The CACHE is mandatory, otherwise QtCreator won’t see the variable and it won’t use it
Qt5.12.8ForAndroid
如果只是使用Qt自身提供的组件,而不引入第三方组件,则建议使用Window系统,因为Qt和Android支持得非常成熟。
但一旦需要引入第三方库时,建议使用ubuntu进行开发。因为官方的linux版本,也是基于ubuntu来开发的。
而在选择ubuntu的版本是非常重要,因为选择错误是经常无法正常启动模拟器或调试的。
本人也是在使用ubuntu20.04/ubuntu18.10/ubuntu19.x/Centos7.x等,吃心苦头后仍不得结果,才开始思考如何让系统顺利运行包括单步调试/编译openssl/zib等第三方组等。
核心关健点:只要能找到官方原生编译系统的环境或配置,并重现该环境,则一定能成功单步调试/自由编译第三方组件
首先,官方仓库是没有发现任何编译脚本。
只能通过源码搜索,检查系统的蛛丝马迹了。
我是按以下方法找到最佳系统版本的。
第一步:下载最新的LTS版本Qt5.12.8的Linux版本,随便找一个linux系统安装,包括源码。
第二步:在源码目录下:搜索“grep -r ‘ubuntu’ ./”,然后它会显示下以下一些信息。
第三步:从输出的信息中,可以确认Qt5.12.8是在ubuntu18.04环境下编译的。
事实上也验证在18.04中安装确实是成功实现单步调试和自由编译第三方包的体验。
以下是安装过程的总结:
1.安装准备
>>Ubuntu18.04,安装后,需要把软件源切换至阿里源。
>>Qt5.12.x最新版【5.12.x只选择LTS版,因为LTS版是Linux系统最常用的,问题最少且最快被修复的版本】
>>AndroidStudio3.5.2版,【从r25开始,AndroidSDK只随IDE一起发布,且SDK结构也与旧版有较大差异。】
>>JDK1.8.x版本。
2.系统安装【VMWare虚拟机安装】。
系统安装,Ubuntu18.04安装成功后,按以下步骤开启GPU和CPU加速,这是android模拟器需要VT-x和图形3D加速
切换软件源
3.安装Qt5.12.8【当前最新版】。把所有组件全部选择上。
4.安装JDK1.8.x版本。
5.安装AndroidStudio,本人选择的是AndroidStudio3.5.2版本,目标是SDK,但从R24版本后的SDK工具是和IDE捆绑一起。
从SDKr24版后,SDK工具已经发生比较大的变化,且不再独立发布,且结构也发生比较大的变化且不兼容,这需要特别注意。
我是默认安装了Android-10
6.配置Qt的Android。
===========================================================
问题列表
问题一:无法创建模拟器,如下图:
需要安装相应的SytemImage,如下图所示【从Android8以后,模拟器主要是提供x86模拟器,而Arm是直接连接设备即可,既然是模拟器那是哪一种模拟器就不重要了】:
=————————————-
问题二:
Android SDK启动提示:Failed to load module “canberra-gtk-module”
sudo apt-get install libcanberra-gtk-module
————————————————
问题三:
Linux环境下,如下报如下错:
cannot find -lGL
collect2:error:ld returned 1 exit status
sudo apt-get install libgl1-mesa-dev
—————————
问题三:
gcc无法使用
ubuntu:
报错When executing step “Make”
sudo apt-get install build-essential
—————————————–
rlogin服务安装
rsh与rlogin好像是互通
yum install rsh rsh-server
systemctl enable rlogin.socket
systemctl start rlogin.socket
systemctl status rlogin.socket