android ndk编译libevent
最近需要编译一下libevent到android设备上跑一下,这里说下基于cmake的编译方式。
一、准备工作。
很多软件越来越多的选择了支持cmake构建,可以比较方便的跨平台。这里编译的2.1.8, 编译到android的armeabi、armeabi-v7a、arm64-v8a、x86、x86_64下面。
从 libevent的github地址,https://github.com/libevent/libevent 检出tag release-2.1.8-stable
① git co -b release-2.1.8-stable release-2.1.8-stable。后续编译在此基础上编译。不要从libevent官网下载,下载的没有cmake相关文件,直接从github libevent仓库,官方检出。
② android-cmake, 检出 https://github.com/taka-no-me/android-cmake,要用到这个。
③ ndk用的是android-ndk-r13b
二、编译
2.1 处理下android-ndk-r13b
由于android-ndk-r13b的头文件有问题,libevent编译的时候会报arc4random相关的错误,这里改一下android-ndk-r13b:find . -name “*.h” -o -name “*.c” -o -name “*.cpp”|xargs grep “void arc4random_”
找出arc4random_ 系列函数声明的地方,注释之。由于我编译的是基于android-9 anrdoid-21,因此可以注释这些函数声明
// void arc4random_buf(void*, size_t);
// extern void arc4random_addrandom(unsigned char *, int);
注释这些即可。
2.2 修改CMakeLists.txt
如图几步的修改
① 打开编译动态库。
② 关闭thread支持
③ 关闭openssl支持
④ 关闭checkfuntion arc4random的检查
⑤ 关闭waitpid的检查,不然编译会检查出问题,
⑥ 去掉soversion, 最后希望在so里面是libevent.so 而不是libevent.so.2.1.8
2.3 编译脚本
mkdir build, 在build目录下准备几个脚本。
compile.sh-android-one, 内容如下:
cmake -DCMAKE_TOOLCHAIN_FILE=~/Android/android-cmake/android.toolchain.cmake \
-DANDROID_NDK=~/Android/android-ndk-r13b \
-DCMAKE_BUILD_TYPE=Release \
-DANDROID_ABI="$1" \
-DANDROID_NATIVE_API_LEVEL=9 \
-DANDROID_STL=gnustl_static \
-DCMAKE_INSTALL_PREFIX=/home/dengpan/tmp/libevent-2.1.8/$1 \
..
compile.sh-linux, 内容如下:
cmake \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=/home/dengpan/tmp/libevent-2.1.8/linux \
..
compileAll.sh, 内容如下:
#!/bin/bash
for i in armeabi armeabi-v7a arm64-v8a x86 x86_64
do
ls | grep -vE "compileAll.sh|compile.sh-android-one|compile.sh-linux"|xargs rm -rf
./compile.sh-android-one $i
make -j10
make install
ls | grep -vE "compileAll.sh|compile.sh-android-one|compile.sh-linux"|xargs rm -rf
done
#开始编译linux
ls | grep -vE "compileAll.sh|compile.sh-android-one|compile.sh-linux"|xargs rm -rf
./compile.sh-linux
make -j10
make install
ls | grep -vE "compileAll.sh|compile.sh-android-one|compile.sh-linux"|xargs rm -rf
执行,./compileAll.sh 即可在 ~/tmp/libevent-2.1.8下面,看到完整编译好的libevent的android (armeabi armeabi-v7a armeabi-v8a x86 x86_64) 跟 linux版本了。
2.4 编译好的prebuilt版本,下载即用
以上代码的完整版本在, 下载地址
libevent-2.1.8的编译好的android ndk(armeabi armeabi-v7a arm64-v8a x86 x8664)、linux版本的编译好的版本,下载即用, 下载地址 。




评论
发表评论