Android下使用ACE开源网络库
admin
2023-02-09 22:20:06
0

   最近公司要求将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

    #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链接时会报链接错误,导致最终生成失败。



相关内容

热门资讯

德国总理:美国正在被伊朗羞辱 德国之声4月27日报道,德国总理默茨在访问一所学校时表示,在当前的持续冲突中,伊朗领导层正试图羞辱美...
理响中国|“长”歌以行,风云激... 光阴如梭,东方潮阔。这里是中国的长三角,世界的长三角。无论过去、现在还是未来,这片土地都因时代而生,...
白宫:特朗普及其国安团队开会讨... 新华社华盛顿4月27日电 美国白宫新闻秘书莱维特27日在记者会上证实,总统特朗普及其国家安全团队当天...
人民日报刊文:日本放开杀伤性武... 日本放开杀伤性武器出口推高地缘冲突风险(国际论坛)常思纯《人民日报》(2026年04月28日 第 0...
医疗保障法草案二审:明确生育保... 满足多样化健康保障需求本报记者 彭 波4月27日,医疗保障法草案二审稿提请十四届全国人大常委会第二十...
天津一景区发生自转旋翼机事故1... 澎湃新闻记者 吕新文中国民用航空华北地区管理局4月22日公布《豪客通航“10•1”天津长芦汉盐旅游区...
卡塔尔埃米尔与美国总统特朗普通... 当地时间24日,卡塔尔埃米尔塔米姆与美国总统特朗普通电话,重点就中东地区局势以及伊朗与美国谈判问题交...
男子30年前被扣押2859克黄... 澎湃新闻记者 王鑫家住辽宁省大连市的潘永嘉近日向澎湃新闻反映称,三十年前,他在大连周水子机场被盖州市...
商务部:取消反制欧盟两家金融机... 中华人民共和国商务部令二〇二六年 第1号鉴于欧盟已取消对中国两家金融机构的制裁措施,现公布《关于取消...
过去24小时共有5艘船只通过霍... 总台记者当地时间24日获悉,过去24小时内,共有5艘船只通过霍尔木兹海峡,其中包括一艘伊朗油轮。(总...