如何确定设备工具链?Android平台C共享库测试应用编译问询
确定Android设备工具链与NDK编译完整指南
一、如何匹配设备对应的工具链
核心是先明确你的Android设备的CPU架构(ABI),这是选择工具链的关键:
- 查看设备ABI:在电脑上连接设备后,运行命令
adb shell getprop ro.product.cpu.abi,就能直接获取当前设备的ABI类型(比如arm64-v8a、armeabi-v7a、x86等) - 对应NDK工具链:NDK的工具链按ABI分类存放,比如针对
arm64-v8a的是aarch64-linux-android-*系列工具,armeabi-v7a对应arm-linux-androideabi-*,你可以在NDK安装目录的toolchains/llvm/prebuilt/<你的操作系统>/bin路径下找到对应的编译工具(如aarch64-linux-android-gcc)
二、完善你的Android.mk配置与编译逻辑
你已经写了预编译共享库的基础代码,我帮你补全测试应用的完整配置,并标注关键注意点:
完整Android.mk示例
LOCAL_PATH := $(call my-dir) # 预编译第一个依赖共享库 include $(CLEAR_VARS) LOCAL_MODULE := depend1 # 注意:这里的路径要和你的预编译库存放位置匹配,若按ABI分目录,可写成 jniLibs/arm64-v8a/libdepend1.so LOCAL_SRC_FILES := libdepend1.so include $(PREBUILT_SHARED_LIBRARY) # 预编译第二个依赖共享库 include $(CLEAR_VARS) LOCAL_MODULE := depend2 LOCAL_SRC_FILES := libdepend2.so include $(PREBUILT_SHARED_LIBRARY) # 编译测试应用可执行文件 include $(CLEAR_VARS) LOCAL_MODULE := test # 替换成你的测试应用C源码文件名,比如test.c LOCAL_SRC_FILES := test.c # 链接依赖的两个共享库 LOCAL_SHARED_LIBRARIES := depend1 depend2 # 明确指定目标ABI,和设备保持一致(可选,但能避免编译多余架构) LOCAL_MODULE_TARGET_ARCH := arm64-v8a include $(BUILD_EXECUTABLE)
额外优化:搭配Application.mk统一配置
如果用的是较新版本NDK,建议新增Application.mk来统一全局配置:
# Application.mk示例 APP_ABI := arm64-v8a # 和设备ABI一致 APP_PLATFORM := android-24 # 对应设备的Android版本API等级,比如Android7.0对应API24
三、编译与运行测试应用的步骤
- 把预编译的
libdepend1.so、libdepend2.so,以及你的test.c、Android.mk、Application.mk放在同一目录(或按NDK规范,将库放在jniLibs/<ABI>子目录) - 打开终端进入该目录,执行NDK编译命令:
ndk-build
- 编译完成后,会在
libs/<目标ABI>目录下生成test可执行文件和对应的共享库 - 将文件推送到设备:
adb push libs/<目标ABI>/test /data/local/tmp/ adb push libs/<目标ABI>/libdepend1.so /data/local/tmp/ adb push libs/<目标ABI>/libdepend2.so /data/local/tmp/
- 赋予权限并运行:
adb shell chmod +x /data/local/tmp/test adb shell LD_LIBRARY_PATH=/data/local/tmp /data/local/tmp/test
这样就能顺利完成你的C语言测试应用在Android设备上的编译与运行了。
内容的提问来源于stack exchange,提问作者Rohith Mohan




