加入收藏 | 设为首页 | 会员中心 | 我要投稿 航空爱好网 (https://www.52kongjun.com/)- 自然语言处理、云硬盘、数据治理、数据工坊、存储容灾!
当前位置: 首页 > 教程 > 正文

Android下运用ACE开源网络库

发布时间:2023-11-02 11:30:50 所属栏目:教程 来源:转载
导读:   最近公司要求将PC平台下的代码移植到Android平台,其中涉及到的ACE开源代码,虽然ACE比较笨重,但由于种种历史原因,我不可能将ACE给踢掉重新开发,故需要解决ACE开源库在Android下的编
  最近公司要求将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链接时会报链接错误,导致最终生成失败。
 

(编辑:航空爱好网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章