一、环境准备 1. 基础依赖安装(CentOS 7) yuminstall -y gcc gcc-c++make unzip wget binutils2. NDK 环境(已预置) NDK 路径:/opt/android-ndk-r21e 核心:NDK r21e 适配 CentOS 7,是安卓交叉编译的稳定版本 二、源码准备 1. 解压源码 # 假设压缩包在当前目录,解压到指定路径 tar -xjvf ACE+TAO-6.5.13.tar.bz2 -C /tmp/android/# 进入 ACE 源码根目录(核心路径) cd /tmp/android/ACE_wrappers2. 补全安卓专属头文件(6.5.13 版本缺失) cat > /tmp/android/ACE_wrappers/ace/os_android.h<< EOF #ifndef ACE_OS_ANDROID_H #define ACE_OS_ANDROID_H #include "ace/os_bsd_include.h" #include "ace/os_linux_include.h" #define ACE_HAS_ANDROID 1 #define ACE_HAS_LINUX 1 #define ACE_HAS_BSD 1 #define ACE_LACKS_SEM_TIMEDWAIT 1 #define ACE_LACKS_PTHREAD_RWLOCK_T 1 #define ACE_LACKS_PTHREAD_RWLOCKATTR_T 1 #define ACE_LACKS_PTHREAD_RWLOCK_INIT 1 #define ACE_LACKS_PTHREAD_RWLOCK_DESTROY 1 #define ACE_LACKS_PTHREAD_RWLOCK_LOCK 1 #define ACE_LACKS_PTHREAD_RWLOCK_UNLOCK 1 #define ACE_LACKS_PTHREAD_RWLOCK_TRYLOCK 1 #define ACE_LACKS_CLOCK_GETTIME 1 #define ACE_LACKS_CLOCK_SETTIME 1 #define ACE_LACKS_CLOCK_GETRES 1 #define ACE_HAS_POSIX_SEM 1 #define ACE_HAS_PTHREADS 1 #define ACE_HAS_SCHED_YIELD 1 #define ACE_HAS_SIGINFO_T 1 #define ACE_OS_NAME android #define ACE_OS_VERSION ACE_ANDROID_VERSION #define ACE_HAS_STRDUP 1 #define ACE_HAS_STRCASECMP 1 #define ACE_HAS_STRNCASECMP 1 #define ACE_LACKS_SYSV_IPC 0 #define ACE_LACKS_UNIX_DOMAIN_SOCKETS 0 #undef ACE_HAS_TLS #define ACE_HAS_TLS 0 #endif // ACE_OS_ANDROID_H EOF 三、交叉编译工具链生成(arm64-v8a 架构) # 导出 NDK 路径 export ANDROID_NDK = /opt/android-ndk-r21e# 生成 arm64-v8a 独立工具链(API 21 适配安卓 5.0+) $ANDROID_NDK /build/tools/make_standalone_toolchain.py\ --arch arm64\ --api21 \ --install-dir /opt/android-toolchain-arm64-v8a# 配置工具链环境变量 export TOOLCHAIN = /opt/android-toolchain-arm64-v8aexport CC = $TOOLCHAIN /bin/aarch64-linux-android-clangexport CXX = $TOOLCHAIN /bin/aarch64-linux-android-clang++export AR = $TOOLCHAIN /bin/aarch64-linux-android-arexport LD = $TOOLCHAIN /bin/aarch64-linux-android-ldexport PATH = $TOOLCHAIN /bin:$PATH 四、ACE 编译配置 1. 设置 ACE_ROOT 环境变量(关键,解决路径错误) export ACE_ROOT = /tmp/android/ACE_wrappers2. 创建核心配置文件 (1)ace/config.h(安卓编译核心宏) cat > $ACE_ROOT /ace/config.h<< EOF #include "config-android.h" // 官方安卓配置头 #define ACE_AS_STATIC_LIBS 1 // 强制静态库 #define ACE_HAS_MUTEXES 1 // 核心:启用互斥锁(ACE_Thread_Mutex依赖) #define ACE_HAS_RECURSIVE_MUTEXES 1 // 递归锁(可选,增强兼容性) #define ACE_HAS_THREADS 1 // 显式启用线程(避免官方配置覆盖) #define ACE_NO_INLINE 1 // 关闭内联,确保符号导出 EOF (2)include/makeinclude/platform_macros.GNU(编译规则) mkdir -p$ACE_ROOT /include/makeincludecat > $ACE_ROOT /include/makeinclude/platform_macros.GNU<< EOF # 1. 基础编译模式(强制静态库) static_libs=1 shared_libs=0 build_libs=1 # 2. NDK/架构/API 配置(适配 r21e) android_ndk := /opt/android-ndk-r21e android_api := 21 android_abi := arm64-v8a ANDROID_ABI :=$( android_abi) CROSS_COMPILE := aarch64-linux-android # 3. 强制指定编译器(严谨版) CC :=$( android_ndk) /toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android$( android_api) -clang CXX :=$( android_ndk) /toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android$( android_api) -clang++ AR :=$( android_ndk) /toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android-ar # 替换llvm-ar为原生ar(避免符号问题) RANLIB :=$( android_ndk) /toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android-ranlib # 4. 先定义核心宏(关键!避免被官方配置覆盖) # 基础宏(线程/互斥锁核心) CPPFLAGS += -DACE_HAS_THREADS=1 CPPFLAGS += -DACE_HAS_MUTEXES=1 CPPFLAGS += -DACE_HAS_RECURSIVE_MUTEXES=1 CPPFLAGS += -DACE_HAS_PTHREADS=1 CPPFLAGS += -DACE_HAS_PTHREADS_STUBS=1 # 系统兼容宏 CPPFLAGS += -DACE_HAS_ALLENGLISH=1 CPPFLAGS += -DACE_HAS_ANSI_CPP=1 CPPFLAGS += -DACE_HAS_SOCKETS=1 CPPFLAGS += -DACE_HAS_NETDB_H=1 CPPFLAGS += -DACE_HAS_ARPA_INET_H=1 CPPFLAGS += -DACE_HAS_INET_NTOP=1 CPPFLAGS += -DACE_HAS_INET_PTON=1 CPPFLAGS += -DACE_HAS_STRCASECMP=1 CPPFLAGS += -DACE_HAS_STRNCASECMP=1 CPPFLAGS += -DACE_HAS_TIME_POLICY=1 CPPFLAGS += -DACE_HAS_STANDARD_CPP_LIBRARY=1 CPPFLAGS += -DACE_USES_STD_NAMESPACE=1 CPPFLAGS += -DACE_HAS_MALLOC=1 CPPFLAGS += -DACE_HAS_MEMCPY=1 CPPFLAGS += -DACE_HAS_STRING_H=1 CPPFLAGS += -DACE_HAS_CSTRING=1 CPPFLAGS += -DACE_HAS_ITOAM=1 # NDK版本宏 CPPFLAGS += -D__NDK_MAJOR__=21 -D__NDK_MINOR__=0 # 5. 再导入官方配置(避免覆盖自定义宏) include$( ACE_ROOT) /include/makeinclude/platform_android.GNU # 6. 编译参数(调整C++标准+补全) CXXFLAGS += -std=c++11 // 替换c++98为c++11(ACE 6.x+兼容更好) CXXFLAGS += -fPIC -march=armv8-a // PIC+armv8-a架构 CXXFLAGS += -DANDROID -D__ANDROID_API__=$( android_api) // 显式指定安卓API # 链接参数 LDFLAGS += -march=armv8-a -lpthread -ldl -lm -llog // 补全llog(安卓日志库) LIBS += -lpthread -ldl -lm -llog EOF 五、编译 ACE 静态库 1. 仅编译核心库(跳过测试/示例,加速) cd $ACE_ROOT # 清理残留(可选) make -C ace clean# 编译核心库(-j 后接CPU核心数,如 -j4) make -C ace -j42. 全量编译(可选,耗时久) # 我这里用的是这个 cd $ACE_ROOT make cleanmake -j4六、编译结果验证 1. 库文件位置 编译方式 libACE.a 路径 全量编译 /tmp/android/ACE_wrappers/lib// .a
2. 验证安卓架构(核心) # 检查库架构(arm64-v8a 特征:ELF64 + AArch64) $TOOLCHAIN /bin/aarch64-linux-android-readelf -h /tmp/android/ACE_wrappers/ace/libACE.a| grep -E"Class|Machine"
3. 验证安卓特征 # 确认 ACE 安卓适配宏 $TOOLCHAIN /bin/aarch64-linux-android-objdump -s /tmp/android/ACE_wrappers/ace/libACE.a| grep -i"ace_has_android" # 输出 ACE_HAS_ANDROID=1 即验证通过 七、头文件整理(自动化脚本) 1. 创建整理脚本(整理ACE头文件.sh) #!/bin/bash set -e# 配置项 ACE_SRC_DIR = "/tmp/android/ACE_wrappers/ace" OUTPUT_DIR = "/opt/ace-android/arm64-v8a/include" # 创建输出目录 echo "【1/4】创建输出目录:$OUTPUT_DIR " mkdir -p"$OUTPUT_DIR /ace" # 仅拷贝头文件(.h/.hpp) echo -e"\n 【2/4】拷贝 ACE 头文件..." find "$ACE_SRC_DIR " -maxdepth1 -type f\ ( -name"*.h" -o -name"*.hpp" \ ) -execcp { } "$OUTPUT_DIR /ace/" \ ; find "$ACE_SRC_DIR " -mindepth2 -type f\ ( -name"*.h" -o -name"*.hpp" \ ) | while read -rfile ; do target_path = "$OUTPUT_DIR /ace/$( dirname "${file# $ACE_SRC_DIR/ } " ) " mkdir -p"$target_path " cp "$file " "$target_path /" done # 清理冗余文件 echo -e"\n 【3/4】清理冗余文件..." find "$OUTPUT_DIR /ace" -type f! \ ( -name"*.h" -o -name"*.hpp" \ ) -delete# 验证核心头文件(适配 6.5.13) echo -e"\n 【4/4】验证核心头文件..." CORE_HEADERS = ( "$OUTPUT_DIR /ace/ACE.h" "$OUTPUT_DIR /ace/SOCK.h" "$OUTPUT_DIR /ace/Thread.h" "$OUTPUT_DIR /ace/os_android.h" ) missing_headers = ( ) for header in "${CORE_HEADERS[ @] } " ; do if [ ! -f"$header " ] ; then missing_headers += ( "$header " ) else echo "✅ 存在核心头文件:$header " fi done if [ ${# missing_headers[ @] } -ne0 ] ; then echo -e"\n ❌ 缺失核心头文件: " for missing in "${missing_headers[ @] } " ; do echo "$missing " done exit 1 else echo -e"\n 🎉 ACE 头文件整理完成!" echo "📌 整理后路径:$OUTPUT_DIR /ace" fi 2. 执行脚本 chmod +x 整理ACE头文件.sh ./整理ACE头文件.sh八、最终文件整理(方便安卓项目使用) # 创建统一目录,整合库和头文件 mkdir -p /opt/ace-android/arm64-v8a/lib# 拷贝静态库 cp /tmp/android/ACE_wrappers/ace/libACE.a /opt/ace-android/arm64-v8a/lib/# 头文件已通过脚本整理到 /opt/ace-android/arm64-v8a/include/ace 九、安卓项目集成(示例) 1. CMake 配置 cmake_minimum_required(VERSION 3.10) project(android_ace_demo) # 引入 ACE 头文件 include_directories(/opt/ace-android/arm64-v8a/include) # 引入 ACE 库路径 link_directories(/opt/ace-android/arm64-v8a/lib) # 编译测试程序 add_executable(demo main.cpp) # 链接 ACE 库及安卓系统库 target_link_libraries(demo libACE.a pthread dl)2. Android.mk 配置 LOCAL_C_INCLUDES += /opt/ace-android/arm64-v8a/include LOCAL_LDLIBS += -L/opt/ace-android/arm64-v8a/lib -lACE -lpthread -ldl LOCAL_ABI_FILTERS := arm64-v8a # 匹配编译架构十、其他架构编译(可选,如 armeabi-v7a) # 生成 armeabi-v7a 工具链 $ANDROID_NDK /build/tools/make_standalone_toolchain.py\ --arch arm\ --api21 \ --install-dir /opt/android-toolchain-armeabi-v7a# 重新配置环境变量 export TOOLCHAIN = /opt/android-toolchain-armeabi-v7aexport CC = $TOOLCHAIN /bin/arm-linux-androideabi-clangexport CXX = $TOOLCHAIN /bin/arm-linux-androideabi-clang++export AR = $TOOLCHAIN /bin/arm-linux-androideabi-arexport LD = $TOOLCHAIN /bin/arm-linux-androideabi-ld# 重新编译核心库 cd $ACE_ROOT make -C ace clean&& make -C ace -j4# 验证架构(armeabi-v7a 特征:ELF32 + ARM) $TOOLCHAIN /bin/arm-linux-androideabi-readelf -h /tmp/android/ACE_wrappers/ace/libACE.a| grep -E"Class|Machine" 核心总结 最终可用文件:静态库:/opt/ace-android/arm64-v8a/lib/libACE.a 头文件:/opt/ace-android/arm64-v8a/include/ace/ 适配环境:安卓 5.0+(API 21)、arm64-v8a 架构; 关键注意:ACE 6.5.13 需手动补os_android.h,Socket 头文件为SOCK.h而非Socket.h; 编译优化:用make -C ace仅编译核心库,避免测试用例耗时。