一、准备工作
ndk版本选择(NDK>19,gcc被整合进了clang中, API<23的版本中libc中没有stdin,stdout,stderr)
选择curl适配的ssh2,openssl的版本(openssl版本大框架分为1.0和1.1,libssh2和curl都对其所支持的版本比较敏感),因此选定的curl版本是:7.51.0,libssh2的版本是:1.7.0,openssl的版本是:1.0.2t
二、编译openssl
备注:1、openssl中有stdin,stdout,stderr,因此API请选择>=23的
2、编译出来的openssl版本库.so,最好不要带版本(因为android调用带版本的so很麻烦)
构建脚本:
#!/bin/bash
#请用绝对路径处理
set_env_android(){
# NDK版本如:android-ndk-r16b
_ANDROID_NDK="$1"
# ABI的版本信息如:arm-linux-androideabi-4.9
_ANDROID_EABI="$2"
# API的版本,如:android-26
_ANDROID_API="$3"
# 架构,如:arch-arm
_ANDROID_ARCH="$4"
_ANDROID_NDK_ROOT="/home/jee/$_ANDROID_NDK"
# 工具链路径,如:arm-linux-androideabi-gcc
_ANDROID_NDK_TOOLCHAINS="$_ANDROID_NDK_ROOT/toolchains/$_ANDROID_EABI/prebuilt/linux-x86_64/bin"
# 对应的API和架构下所对应的基本库,如libc.so等
_ANDROID_SYSROOT="$_ANDROID_NDK_ROOT/platforms/$_ANDROID_API/$_ANDROID_ARCH"
# 标准C基本头文件目录
_ANDROID_SYSROOT_INC1="$_ANDROID_NDK_ROOT/sysroot/usr/include"
_ANDROID_SYSROOT_INC2="$_ANDROID_NDK_ROOT/sysroot/usr/include/arm-linux-androideabi"
export ANDROID_NDK_ROOT=$_ANDROID_NDK_ROOT
export ANDROID_NDK_TOOLCHAINS=$_ANDROID_NDK_TOOLCHAINS
export ANDROID_SYSROOT=$_ANDROID_SYSROOT
export ANDROID_DEV="$_ANDROID_SYSROOT/usr"
export ANDROID_SYSROOT_INC1=$_ANDROID_SYSROOT_INC1
export ANDROID_SYSROOT_INC2=$_ANDROID_SYSROOT_INC2
# 交叉编译器
export CROSS_COMPILE="arm-linux-androideabi-"
export PATH=$PATH:$ANDROID_NDK_TOOLCHAINS
echo "ANDROID_NDK_ROOT=$_ANDROID_NDK_ROOT"
echo "ANDROID_NDK_TOOLCHAINS=$_ANDROID_NDK_TOOLCHAINS"
echo "ANDROID_SYSROOT=$_ANDROID_SYSROOT"
echo "ANDROID_SYSROOT_INC1=$_ANDROID_SYSROOT_INC1"
echo "ANDROID_SYSROOT_INC2=$_ANDROID_SYSROOT_INC2"
echo "CROSS_COMPILE=$CROSS_COMPILE"
#echo "PATH=$PATH"
}
my_build(){
# ./configure "$1=arch" "$2=host" "$3=openssldir" $4=prefixdir" no-asm
# 将头文件所在目录后缀在 CPPFLAGS 中
export CPPFLAGS="--sysroot=$ANDROID_SYSROOT -I$ANDROID_SYSROOT_INC1 -I$ANDROID_SYSROOT_INC2"
export CFLAGS="--sysroot=$ANDROID_SYSROOT -I$ANDROID_SYSROOT_INC1 -I$ANDROID_SYSROOT_INC2"
export CXXFLAGS="--sysroot=$ANDROID_SYSROOT -I$ANDROID_SYSROOT_INC1 -I$ANDROID_SYSROOT_INC2"
./Configure no-asm shared $1 --openssldir=$2 --prefix=$3
}
make_dest()
{
echo "========================================================================================================================"
set_env_android "android-ndk-r16b" "arm-linux-androideabi-4.9" "android-26" "$2"
my_build "$1" "/mnt/d/MyAndroid/open_so/no_version_/openssl-1.0.2t" "/mnt/d/MyAndroid/open_so/no_version_/android_build/ssl/$2"
if [ $? ]
then
# 替换
sed -i 's#SHLIB_EXT=.so.$(SHLIB_MAJOR).$(SHLIB_MINOR)#SHLIB_EXT=.so#g' Makefile
sed -i 's#SHARED_LIBS_LINK_EXTS=.so.$(SHLIB_MAJOR) .so#SHARED_LIBS_LINK_EXTS=.so#g' ./Makefile
sed -i 's#LIBVERSION=$(SHLIB_MAJOR).$(SHLIB_MINOR)#LIBVERSION=#g' ./Makefile
make clean
make -j8
make install CC=arm-linux-androideabi-gcc RANLIB=arm-linux-androideabi-ranlib -j8
else
echo "configure error"
fi
}
make_dest "android" "arch-arm"
#make_dest "android" "arch-arm64"
#make_dest "android" "arch-mips"
#make_dest "android" "arch-mips64"
#make_dest "android" "arch-x86"
#make_dest "android" "arch-x86_64"
二、编译libssh2
构建脚本:
#!/bin/bash
echo "----------------------------cmake release----------------------------"
android_ndk=/home/jee/android-ndk-r16b
echo "ndk_path:$android_ndk"
toolchain=$android_ndk/build/cmake/android.toolchain.cmake
build_type=Release
#gernerator="Ninja"
MyCmakeFun(){
if [ ! -d $1 ]
then
mkdir $1
fi
cd $1
rm -r CMakeFiles
rm .ninja_deps
rm .ninja_log
rm android_gradle_build.json
rm build.ninja
rm cmake_install.cmake
rm CMakeCache.txt
rm rules.ninja
cmake ../../ -DCMAKE_TOOLCHAIN_FILE=$toolchain \
-DANDROID_NDK=$android_ndk \
-DCMAKE_BUILD_TYPE=$build_type \
-DANDROID_ABI="$1" \
-DCMAKE_INSTALL_DOCDIR=./android_install
#-DCMAKE_GENERATOR=$gernerator
make clean
make
make install
#target_dir=../../../../target
#if [ ! -d $target_dir/$1 ]
#then
# mkdir -p $target_dir/$1
#fi
#cp "lib/*" "$target_dir/$1/"
#cp "../../../inc/*.h" "$target_dir/"
}
MyCmakeFun armeabi-v7a %1 %2
cd ../..
#call:MyCmakeFun arm64-v8a %1 %2
#::cd ..
#::call:MyCmakeFun x86 %1 %2
#::cd ..
#::call:MyCmakeFun x86_64 %1 %2
#::cd ..
echo "===== o v e r ===== "
注意修改:src/CMakeList.txt文件,增加openssl
set(OPENSSL_ROOT_DIR "//mnt/d/Program Files/Android/open_so/no_version/openssl-1.0.2t")
set(OPENSSL_LIBRARIES "/home/jee/android_install/ssl/lib")
set(OPENSSL_INCLUDE_DIR "/home/jee/android_install/ssl/include")
set(OPENSSL_CRYPTO_LIBRARY "/home/jee/android_install/ssl/lib")
set(OPENSSL_SSL_LIBRARY "/home/jee/android_install/ssl/lib")
三、编译curl
构建脚本:
#!/bin/bash
//请用绝对路径处理
C_HOME=/home/jee/android-ndk-r16b/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin
ANDROID_SYSROOT=/home/jee/android-ndk-r16b/platforms/android-26/arch-arm/
INC1=/home/jee/android-ndk-r16b/sysroot/usr/include
INC2=/home/jee/android-ndk-r16b/sysroot/usr/include/arm-linux-androideabi
INC_SSL=/home/jee/android_install/ssl/include
INC_SSH2=/home/jee/android_install/ssh2/include
#export CPPFLAGS="--sysroot=$ANDROID_SYSROOT"
#export CFLAGS="--sysroot=$ANDROID_SYSROOT"
#export CXXFLAGS="--sysroot=$ANDROID_SYSROOT"
./configure --host=arm-linux-androideabi CPP=$C_HOME/arm-linux-androideabi-cpp CC=$C_HOME/arm-linux-androideabi-gcc CXX=$C_HOME/arm-linux-androideabi-g++ LD=$C_HOME/arm-linux-androideabi-ld AS=$C_HOME/arm-linux-androideabi-as AR=$C_HOME/arm-linux-androideabi-ar RANLIB=$C_HOME/arm-linux-androideabi-ranlib CPPFLAGS="--sysroot=$ANDROID_SYSROOT -I$INC1 -I$INC2 -I$INC_SSL -I$INC_SSH2" CFLAGS="--sysroot=$ANDROID_SYSROOT -I$INC1 -I$INC2 -I$INC_SSL -I$INC_SSH2 " --prefix=/home/jee/android_install/curl_ssl --with-ssl=/home/jee/android_install/ssl --with-libssh2=/home/jee/android_install/ssh2
时间仓促没有细细整理,但是已完成了编译的目的,简单做个记录,上面的办法比较粗糙,还望看着不舒服的PY海涵。
备注:./configure --help 是个特别棒的东西,可以帮助你得到你想要的信息,从而解决编译中所遇到的困难,完成你的编译目标
参考:https://blog.csdn.net/yuxiatongzhi/article/details/80096802