最近公司要求将PC平台下的代码移植到Android平台,其中涉及到的ACE开源代码,虽然ACE比较笨重,但由于种种历史原因,我不可能将ACE给踢掉重新开发,故需要解决ACE开源库在Android下的编译和使用问题,由于工程中使用多个第三方静态库,对于我这种半路出家的纯C++程序猿来说,还是有些挑战的,在此记录大致过程,以方便其它同学参考,少走些弯路。

首先请自行安装Android开发工具:NDK(r9d)、jdk(jdk1.7.0_45)、ADT(v22.3.0-887826);

ACE――6.0以后的版本已经自带的Android下编译的MakeFile,本人使用的版本是6.2.4,编译需要安装cygwin,请自行安装,安装时选择Devel-install,安装开发工具gcc、g++、ld等。

备注:公司历史版本为5.5.0,由于该版本尚未加入Android Makefile,但并非不支持,但较6.2.4并未出现大的改动,基本可以直接使用,当然如果你偏偏使用了它更改了的代码的话,就需要你自行修改了。

均安装完毕后编译ACE源代码,进入cygwin

1、设置环境变量:

编辑~/.bash_profile文件,在最下方添加

NDK=D:/android-ndk-r9d

export NDK

ACE_ROOT=$NDK/sources/ACE-6.2.4

export ACE_ROOT


ANDROID_ARCH=arm

export ANDROID_ARCH


SYSROOT=$NDK/platforms/android-9/arch-arm

export SYSROOT


PATH=$PATH:$ACE_ROOT/toolchain/bin

export PATH

保存后,执行命令 source ~/.bash_profile使其生效;

2、生成交叉编译环境

执行命令

cd $NDK

./build/tools/make-standalone-toolchain.sh --toolchain=arm-linux-androideabi-4.6 --arch=arm --platform=android-9 --install-dir=./sources/ACE-6.2.4/toolchain--system=windows-x86_64

注:本人系统为window7 64bit,故需指定系统版本(--system=windows-x86_64)。

3、ACE源代码准备

将源代码解压到$NDK/sources/ACE-6.2.4目录下,并作适当的修改,分别为:

a、新建ace/config.h文件,内容如下

#ifndef __ACE_INLINE__

#define __ACE_INLINE__

#endif

#ifdef WIN32

#include "ace/config-win32.h"

#else

#include "ace/config-android.h"

#endif

b、新建include/makeinclude/platform_macros.GNU文件,指定makefile,内容如下

include $(ACE_ROOT)/include/makeinclude/platform_android.GNU

c、辑$(ACE_ROOT)/ace/Basic_Types.h,在适当位置添加如下代码:

#if defined(ANDROID)

# include <sys/endian.h>

#endif

备注:由于在单独使用ace/ACE.h或ace/Basic_Types.h时,ACE对ACE_BYTE_ORDER的定义自相矛盾,所以此处在判断出是Android时,强行导入android下的大小头定义文件。

d、打开$(ACE_ROOT)/include/makeinclude/platform_android.GNU, 并加入如下代码:

CPPFLAGS += -DANDROID

编译ACE静态库,故需添加如下命令:

static_libs=1

备注:如果提示arm-linux-androideabi-g++不存在,请在此文件中CROSS_COMPILE的定义处修改为:

CROSS_COMPILE=$(ACE_ROOT)/toolchain/bin/arm-linux-androideabi-

4、编译

只编译ACE源代码,不编译sample等其它代码,进入

cd $ACE_ROOT/ace

make

等待编译完成,会自动生成到$ACE_ROOT/lib目录。

5、使用

在此列出其中一个工程使用libACE.a的android.mk文件

LOCAL_PATH := $(call my-dir)


include $(CLEAR_VARS)


LOCAL_ARM_MODE := arm

LOCAL_MODULE := libNetwork

LOCAL_MODULE_TAGS := optional

LOCAL_CPP_EXTENSION := .cpp

LOCAL_SRC_FILES := \


LOCAL_C_INCLUDES := \

$(LOCAL_PATH)


LOCAL_CFLAGS := \

'-DANDROID' \

'-DANDROID_ACE' \

'-D__ACE_INLINE__'


LOCAL_WHOLE_STATIC_LIBRARIES := \

p2p_lib \

p2p_client \

p2p_media \

ACE

LOCAL_SHARED_LIBRARIES := \

libstlport


LOCAL_LDLIBS += -llog -ljnigraphics -lz -landroid

include $(BUILD_SHARED_LIBRARY)

相关内容请自行添加;

本工程最终生成libNetwork.so文件,链接到的静态库均有依赖ACE代码,故在LOCAL_WHOLE_STATIC_LIBRARIES中将ACE写在最后面;同时需在其它静态库工程Android.mk文件中同时添加__ACE_INLINE__宏定义,否则在*.so链接时会报链接错误,导致最终生成失败。



更多相关文章

  1. Android(安卓)各种菜单,弹出菜单,打开文件子菜单,文本框的复制粘贴
  2. android(12)_解析xml文件1_dom
  3. android在java代码中动态添加组件及相关布局方法(LayoutParams)
  4. Android(安卓)compress图片压缩介绍
  5. Android(安卓)Studio NDK开发案例二 JNI包含多个cpp文件
  6. Android(java)学习笔记128:使用proguard混淆android代码
  7. Android中的第一个NDK的例子
  8. Android(安卓)Studio错误代码不提示问题解决
  9. android 获取网络图片缓存(内存—>文件—>网络)

随机推荐

  1. android 开发 获取各种intent (图片、apk
  2. Android开发规范:API接口通用设计规范
  3. XML-layer-list
  4. EditText单击触发onclick事件处理
  5. 《Android面试宝典》学习笔记(第三章:组件)
  6. Android实践项目汇报(二)
  7. ubuntu创建wifi热点(android可识别)亲测
  8. [置顶] Android 操作SQLite数据库(初步)-在
  9. 【Android】Android UI 开发_问答_3
  10. Artifactory 4 PRO /HA 版 搭建Android镜