标签归档:ndk

ndk编译openssl-1.1.0f(armeabi armeabi-v7a armeabi-v8a x86 x86-64)几种架构

作者: dplord, 访问量 192





最近因为需要,编译了一下openssl的最新版本。记录下编译过程跟完整的编译脚本。

一、准备工作

  • android-ndk-r13b
  • openssl-1.1.0f.tar.gz

二、开始编译

参考了: https://github.com/leenjewel/openssl_for_ios_and_android/tree/master/tools 里面的脚本,修改了一点。

主要是加入了compileAll.sh,  以及去掉soname。

深度截图_选择区域_20171012004153

因为我要用的位libssl.so、libcrypto.so共享库。因此需要注释这一行。

深度截图_选择区域_20171012004324

这里是让生成的so里面的库文件名没有后缀、soversion, 不然在安卓上无法用。最终生成的so, readelf查看如下:

深度截图_选择区域_20171012010923

 

然后,写了一个compileAll.sh

#!/bin/bash

export ANDROID_NDK=~/Android/android-ndk-r13b


currentPath=`pwd`
destDir="编译好的libs"
rm -rf $currentPath/$destDir
mkdir $currentPath/$destDir

for i in android android-armeabi android64-aarch64 android-x86 android64
do
	rm -rf $currentPath/{arm64-v8a, armeabi, armeabi-v7a, x86_64, x86}-toolchain
	rm -rf $currentPath/libs
	cd $currentPath


	echo "开始编译" 
	echo $i
	if [ "$i" = "android64-aarch64" ]; then
        ANDROID_API=21 bash ./build-openssl4android.sh $i > /dev/null 2&>1
    elif [ "$i" = "x86_64" ]; then
	   ANDROID_API=21 bash ./build-openssl4android.sh $i > /dev/null 2&>1
    else
	   ANDROID_API=9 bash ./build-openssl4android.sh $i > /dev/null 2&>1
    fi
	unset ANDROID_API

	for j in libssl libcrypto
	do
		echo $currentPath/openssl-1.1.0f/$j.so
		echo `find $currentPath/libs/ -name $j.a`

		
		mv $currentPath/openssl-1.1.0f/$j.so `find $currentPath/libs/ -name $j.a|xargs dirname`/
	done	
	cd $currentPath/$destDir && cp -r $currentPath/libs/* .
	echo $i
	echo "编译完成"
done

执行 ./compileAll.sh 即可生成带有动态库、静态库的五种架构的ndk openssl库了。

如果想编译libevent, linux版本的库。

./Configure linux-aarch64 \
--prefix=/home/dengpan/tmp/openssl-linux \
zlib \
no-asm \
no-unit-test

#delete soname, soversion
sed 's/LIBVERSION=$(SHLIB_MAJOR).$(SHLIB_MINOR)//g' Makefile | sed 's/.$ (SHLIB_MAJOR).$(SHLIB_MINOR)//g' > Makefile2
mv -f Makefile2 Makefile

make -j10
make install

 

三、编译脚本、编译好的库下载

android ndk编译libevent

作者: dplord, 访问量 194





最近需要编译一下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版本的编译好的版本,下载即用, 下载地址  。