android ndk编译libevent

作者: dplord, 访问量 215





最近需要编译一下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,因此可以注释这些函数声明

深度截图20171010-2247

// void arc4random_buf(void*, size_t);

// extern void arc4random_addrandom(unsigned char *, int);

注释这些即可。

2.2 修改CMakeLists.txt

深度截图_选择区域_20171010231202深度截图_选择区域_20171010230750

深度截图_选择区域_20171010231202

如图几步的修改

① 打开编译动态库。

② 关闭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版本的编译好的版本,下载即用, 下载地址  。

 

  • dplord

    ndk编译各个版本的头文件、依赖库,都有些不同。坑爹呢