3、开发环境搭建:Android Studio配置、NDK与CMake、QNX SDK安装、Linux交叉编译链配置
说实话,做车载多屏互动项目,最磨人的往往不是业务逻辑,而是开发环境。我见过太多团队,代码写了两周,环境搭了一个月。嗯,今天咱们就把这块硬骨头啃下来。
这套环境涉及四个核心部分:Android Studio、NDK与CMake、QNX SDK、Linux交叉编译链。缺一个,你的多屏项目就跑不起来。我按实际搭建顺序来讲,你跟着走就行。
核心思路:先搭宿主开发环境(Android Studio),再补原生编译能力(NDK+CMake),然后装目标系统工具链(QNX SDK),最后配置交叉编译链做联调。每一步都有坑,我会把踩过的坑指出来。
3.1 Android Studio 配置
Android Studio 是咱们的主战场。多屏互动项目里,车机端、手机端、甚至手表端都可能跑 Android,所以这个 IDE 必须配稳。
版本选择:我个人习惯用 Hedgehog 或 Iguana 版本,太新的版本有时插件兼容性不好。你可以在 About Android Studio 里查看版本号。
必装组件:
- Android SDK Platform 31+ —— 车机系统现在基本是 Android 12 起步
- Android SDK Build-Tools 34+ —— 编译多屏模块需要较新的构建工具
- Android SDK Command-line Tools —— 后面自动化打包会用到
- Google Play Services —— 如果涉及 Car App 库,这个不能少
我在项目中遇到过一个问题:SDK Manager 里下载了 Platform,但 Gradle 编译时还是报 compileSdkVersion not found。后来发现是 SDK 路径配错了。建议你统一把 SDK 路径设到 C:\Android\Sdk(Windows)或 ~/Android/Sdk(Linux/macOS),别用默认的带空格的路径。
小技巧:在 local.properties 文件里手动指定 SDK 路径,比依赖 IDE 自动检测更稳。尤其是多人协作时,这个文件应该加入 .gitignore,但路径规范要写在项目文档里。
3.2 NDK 与 CMake 配置
多屏互动少不了 C/C++ 代码。屏幕采集、编解码、数据传输,这些底层模块几乎都用 NDK 开发。你想想看,如果纯用 Java 做视频帧处理,性能根本扛不住。
NDK 版本:我建议用 r25c 或 r26b。太老的版本不支持新架构,太新的版本可能跟 QNX 工具链有冲突。
安装步骤:
- 在 Android Studio 的 SDK Manager 里,切到 SDK Tools 标签
- 勾选 NDK (Side by side),选择你需要的版本
- 勾选 CMake,建议 3.22.1 以上
- 点击 Apply,等下载完成
CMakeLists.txt 配置示例:
cmake_minimum_required(VERSION 3.22)
project("multiscreen_native")
# 设置 C++ 标准
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# 添加本地库
add_library(screen_capture SHARED
src/screen_capture.cpp
src/encoder.cpp
src/network_sender.cpp
)
# 链接系统库
target_link_libraries(screen_capture
android
log
mediandk
camera2ndk
)
# 指定输出目录
set_target_properties(screen_capture PROPERTIES
LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/../libs/${ANDROID_ABI}
)
我曾经犯过一个低级错误:在 CMakeLists.txt 里忘了加 log 库,结果 __android_log_print 一直编译不过。排查了整整半天。你记得把常用库都链上。
注意:NDK 的 ABI 选择要跟车机芯片匹配。目前主流车机用 arm64-v8a,少数老平台用 armeabi-v7a。x86 架构基本只在模拟器上用。别一股脑全编译,浪费时间。
3.3 QNX SDK 安装
QNX 是车载系统的老大哥。很多高端车机的仪表盘、中控屏都跑在 QNX 上。咱们的多屏互动项目,如果目标平台是 QNX,那这套 SDK 必须装。
获取方式:QNX SDK 需要向 BlackBerry 申请,或者从你的芯片供应商(比如高通、瑞萨)获取。一般会拿到一个 .bin 安装包。
安装流程:
- 给安装包加执行权限:
chmod +x qnx-sdk-install.bin - 运行安装:
./qnx-sdk-install.bin - 选择安装路径,我习惯放在
/opt/qnx下 - 安装完成后,设置环境变量
环境变量配置(加到 ~/.bashrc 或 ~/.zshrc):
export QNX_HOST=/opt/qnx/qnx710/host/linux/x86_64
export QNX_TARGET=/opt/qnx/qnx710/target/qnx7
export PATH=$QNX_HOST/usr/bin:$PATH
export QNX_CONFIGURATION=/etc/qnx
我记得第一次装 QNX SDK 时,忘了配 QNX_CONFIGURATION,结果编译时一直报 license not found。后来发现是 license 文件没放到正确位置。你装完后记得先跑一下 qcc --version 验证。
经验之谈:QNX 的编译器是 qcc,不是 gcc。它底层其实封装了 GCC,但加了很多 QNX 特有的参数。写 Makefile 时记得用 CC = qcc,别用 gcc。
3.4 Linux 交叉编译链配置
交叉编译链是连接开发机和目标板的桥梁。咱们在 x86 的电脑上写代码,编译出 arm 架构的可执行文件,然后丢到车机上跑。这就是交叉编译。
常见工具链:
| 目标平台 | 工具链名称 | 前缀 |
|---|---|---|
| ARM 32位 | arm-linux-gnueabihf | arm-linux-gnueabihf- |
| ARM 64位 | aarch64-linux-gnu | aarch64-linux-gnu- |
| QNX ARM 64位 | qcc (QNX自带) | n/a |
安装步骤(以 aarch64 为例):
- 安装工具链:
sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu - 验证安装:
aarch64-linux-gnu-gcc --version - 写一个测试程序,交叉编译:
aarch64-linux-gnu-gcc -o hello hello.c - 用
file hello查看,确认是 ELF 64-bit ARM 格式
CMake 交叉编译文件示例(toolchain.cmake):
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)
set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)
set(CMAKE_FIND_ROOT_PATH /usr/aarch64-linux-gnu)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
使用时:cmake -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake ..
我遇到过最坑的事:交叉编译出来的程序,在车机上跑起来就段错误。查了两天,发现是编译时用了宿主机的 glibc,而不是目标板的。你记得在 CMAKE_FIND_ROOT_PATH 里指定目标系统的库路径。
重要提醒:交叉编译链的版本必须跟车机系统的 glibc 版本匹配。比如车机是 glibc 2.31,你拿 2.35 的工具链编译,跑起来必崩。怎么查?在车机上执行 ldd --version,或者问供应商要系统信息。
3.5 环境验证清单
所有环境搭完后,我建议你跑一遍这个验证清单。别等到项目编译不过再回头查。
| 检查项 | 命令/方法 | 预期结果 |
|---|---|---|
| Android Studio 版本 | Help → About | 显示版本号,无红色警告 |
| NDK 版本 | ndk-build --version |
显示 r25c 或 r26b |
| CMake 版本 | cmake --version |
3.22.1 以上 |
| QNX 编译器 | qcc --version |
显示 QNX 版本信息 |
| 交叉编译链 | aarch64-linux-gnu-gcc -v |
显示 GCC 版本,无错误 |
| 交叉编译测试 | 编译 hello.c 并 file 查看 |
ELF 64-bit ARM aarch64 |
这张表我建议你打印出来贴在工位上。每配完一项就打个勾,心里踏实。
环境搭好只是第一步。下一节咱们会讲项目结构怎么组织,代码怎么分层。但今天先把这些工具链跑通,别急着往下赶。我见过太多人环境没配好就急着写代码,最后编译报错一堆,心态直接崩了。
稳一点,把基础打牢。后面的事情就顺了。