CentOS7 交叉编译 ACE+TAO-6.5.13 安卓 arm64-v8a 静态库

一、环境准备

1. 基础依赖安装(CentOS 7)

bash 复制代码
yum install -y gcc gcc-c++ make unzip wget binutils

2. NDK 环境(已预置)

  • NDK 路径:/opt/android-ndk-r21e
  • 核心:NDK r21e 适配 CentOS 7,是安卓交叉编译的稳定版本

二、源码准备

1. 解压源码

bash 复制代码
# 假设压缩包在当前目录,解压到指定路径
tar -xjvf ACE+TAO-6.5.13.tar.bz2 -C /tmp/android/
# 进入 ACE 源码根目录(核心路径)
cd /tmp/android/ACE_wrappers

2. 补全安卓专属头文件(6.5.13 版本缺失)

bash 复制代码
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 架构)

bash 复制代码
# 导出 NDK 路径
export ANDROID_NDK=/opt/android-ndk-r21e
# 生成 arm64-v8a 独立工具链(API 21 适配安卓 5.0+)
$ANDROID_NDK/build/tools/make_standalone_toolchain.py \
  --arch arm64 \
  --api 21 \
  --install-dir /opt/android-toolchain-arm64-v8a

# 配置工具链环境变量
export TOOLCHAIN=/opt/android-toolchain-arm64-v8a
export CC=$TOOLCHAIN/bin/aarch64-linux-android-clang
export CXX=$TOOLCHAIN/bin/aarch64-linux-android-clang++
export AR=$TOOLCHAIN/bin/aarch64-linux-android-ar
export LD=$TOOLCHAIN/bin/aarch64-linux-android-ld
export PATH=$TOOLCHAIN/bin:$PATH

四、ACE 编译配置

1. 设置 ACE_ROOT 环境变量(关键,解决路径错误)

bash 复制代码
export ACE_ROOT=/tmp/android/ACE_wrappers

2. 创建核心配置文件

(1)ace/config.h(安卓编译核心宏)
bash 复制代码
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(编译规则)
bash 复制代码
mkdir -p $ACE_ROOT/include/makeinclude
cat > $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. 仅编译核心库(跳过测试/示例,加速)

bash 复制代码
cd $ACE_ROOT
# 清理残留(可选)
make -C ace clean
# 编译核心库(-j 后接CPU核心数,如 -j4)
make -C ace -j4

2. 全量编译(可选,耗时久)

bash 复制代码
# 我这里用的是这个
cd $ACE_ROOT
make clean
make -j4

六、编译结果验证

1. 库文件位置

编译方式 libACE.a 路径
全量编译 /tmp/android/ACE_wrappers/lib//.a

2. 验证安卓架构(核心)

bash 复制代码
# 检查库架构(arm64-v8a 特征:ELF64 + AArch64)
$TOOLCHAIN/bin/aarch64-linux-android-readelf -h /tmp/android/ACE_wrappers/ace/libACE.a | grep -E "Class|Machine"
  • 正确输出:

    复制代码
    Class:                             ELF64
    Machine:                           AArch64

3. 验证安卓特征

bash 复制代码
# 确认 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)

bash 复制代码
#!/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" -maxdepth 1 -type f \( -name "*.h" -o -name "*.hpp" \) -exec cp {} "$OUTPUT_DIR/ace/" \;
find "$ACE_SRC_DIR" -mindepth 2 -type f \( -name "*.h" -o -name "*.hpp" \) | while read -r file; 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[@]} -ne 0 ]; 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. 执行脚本

bash 复制代码
chmod +x 整理ACE头文件.sh
./整理ACE头文件.sh

八、最终文件整理(方便安卓项目使用)

bash 复制代码
# 创建统一目录,整合库和头文件
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 复制代码
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 配置

makefile 复制代码
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)

bash 复制代码
# 生成 armeabi-v7a 工具链
$ANDROID_NDK/build/tools/make_standalone_toolchain.py \
  --arch arm \
  --api 21 \
  --install-dir /opt/android-toolchain-armeabi-v7a

# 重新配置环境变量
export TOOLCHAIN=/opt/android-toolchain-armeabi-v7a
export CC=$TOOLCHAIN/bin/arm-linux-androideabi-clang
export CXX=$TOOLCHAIN/bin/arm-linux-androideabi-clang++
export AR=$TOOLCHAIN/bin/arm-linux-androideabi-ar
export 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"

核心总结

  1. 最终可用文件:
    • 静态库:/opt/ace-android/arm64-v8a/lib/libACE.a
    • 头文件:/opt/ace-android/arm64-v8a/include/ace/
  2. 适配环境:安卓 5.0+(API 21)、arm64-v8a 架构;
  3. 关键注意:ACE 6.5.13 需手动补 os_android.h,Socket 头文件为 SOCK.h 而非 Socket.h;
  4. 编译优化:用 make -C ace 仅编译核心库,避免测试用例耗时。
相关推荐
千里马学框架3 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台3 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone3 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc3 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo3 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077003 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼3 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone3 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen3 天前
属性动画原理与高级动画实现
android·kotlin·canvas
AFinalStone3 天前
Android7 SystemUI 源码解析(二)启动流程深度解析
android·systemui