基础阅读:
Windows环境下Android NDK环境搭建
一. 设置ACE的NDK交叉编译环境(ARM平台)
可以参考 NDK主目录下的<NDK>/docs/STANDALONE-TOOLCHAIN.html
1. 运行Cygwin Terminal
2. 生成NDK standalone toolchain交叉编译环境
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.0/toolchain
./sources/ACE-6.2.0/toolchain是你交叉编译环境的复制路径,这个新生成的文件夹即是你的交叉编译环境
运行make-standalone-toolchain.sh时,有可能会报Permission denied的错误,解决方法:
方法一. 关掉Cygwin Terminal,再以管理员身份运行。
方法二. 当前用户没有对$NDK的完全管理权限,在$NDK目录上右击,点属性,在安全选项卡中为当前用户赋予完全控制的权限。
3. 关闭Cygwin Terminal
4. 编辑<cygwin>/home/<当前用户名>/.bash_profile。添加如下项:
#设置ACE的解压后的路径,此处将其解压至<NDK>/sources/ACE-6.2.0下 ACE_ROOT=$NDK/sources/ACE-6.2.0 export ACE_ROOT #其实ANDROID_ARCH、SYSROOT不是必须的,在$(ACE_ROOT)/include/makeinclude/platform_android.GNU下有缺省定义 #其缺省值与此处定义的一样 ANDROID_ARCH=arm export ANDROID_ARCH # android-9由你的android开发版本所定, 9为Androind2.3 SYSROOT=$NDK/platforms/android-9/arch-arm export SYSROOT PATH=$PATH:$NDK/sources/ACE-6.2.0/toolchain/bin export PATH
二. 使用NDK编译ACE
可以参考:<ACE_ROOT>/ACE-INSTALL.html里的"Building and Installing ACE on Android"一节。
确认进行了(一)所提到的步骤
1.下载ACE包,并解压至<NDK>/sources/ACE-6.2.0
2 在ace子目录新建文件config.h,在其中添加
#ifndef __ACE_INLINE__ # define __ACE_INLINE__ #endif #include "ace/config-android.h"
在有些情况下,使用的ACE的程序需要以__ACE_INLINE__进行编译,否则会有类似ACE_Thread_Mutex::acquire函数未定义的错误。因此我们在此处添加该宏。
3.在include/makeinclude子目录新建文件platform_macros.GNU,在其中添加
include $(ACE_ROOT)/include/makeinclude/platform_android.GNU
4. 编辑$(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下的大小头定义文件
5. 打开$(ACE_ROOT)/include/makeinclude/platform_android.GNU, 并加入如下代码:
CPPFLAGS += -DANDROID
6.打开Cygwin Terminal
cd $NDK/sources/ACE-6.2.0/ace make
7. 编译完成后在$NDK/sources/ACE-6.2.0目录下创建一个名为Android.mk的文件,文件内容如下:
LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE:= ACE LOCAL_SRC_FILES:= lib/libACE.a LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH) include $(PREBUILT_STATIC_LIBRARY)
此处只列出了libACE.a。可以根据自己的需要调整自己的包含
与建普通jni程序相同,但是在Android.mk中需加入-D__ACE_INLINE__宏,否则在示例代码中链接时会报:找不到ACE_Thread_Mutex::acquire。
代码见:NDK下使用ACE示例