这几天需要在安卓上使用crypto++库,编译搞了半天,官方文档看起来贼费劲。。
我在centos7上编译的,请确保你的机器有GLIBC_2.14版本的库,详见后续问题点。
首先根据下面的文档装好ndk和设置环境变量:
https://www.cryptopp.com/wiki/Android_Setup_(Command_Line)
步骤:
一:下载ndk并解压到 /opt
$ curl -k -L -o android-ndk-r19c-linux-x86_64.zip https://dl.google.com/android/repository/android-ndk-r19c-linux-x86_64.zip
$ sudo unzip android-ndk-r19c-linux-x86_64.zip -d /opt
二、创建符号链接/opt/android-ndk,指向/opt/android-ndk-r19c/
$ sudo ln -s /opt/android-ndk-r19c/ /opt/android-ndk
$ ls -Al /opt/android-ndk
lrwxrwxrwx 1 root root 22 Apr 10 12:41 /opt/android-ndk -> /opt/android-ndk-r19c/
三、下载安卓SDK并解压到 /opt/android-sdk
$ wget https://dl.google.com/android/repository/sdk-tools-linux-4333796.zip
$ sudo unzip sdk-tools-linux-4333796.zip -d /opt/android-sdk
四、给sdk中的可执行文件添加可执行权限
sudo find /opt -type f -executable -exec chmod +x {} \;
五、更新SDK,安装APIS
$ sudo /opt/android-sdk/tools/bin/sdkmanager --update
$ sudo /opt/android-sdk/tools/bin/sdkmanager "platforms;android-28" "build-tools;28.0.3"
六、设置环境变量
首先打开/etc/profile,添加一下脚本到该文件:(设置变量ANDROID_NDK_ROOT,ANDROID_SDK_ROOT,ANDROID_HOME)
if [ -d /opt/android-ndk ]; then
export ANDROID_NDK_ROOT=/opt/android-ndk
fi
if [ -d /opt/android-sdk ]; then
export ANDROID_SDK_ROOT=/opt/android-sdk
export ANDROID_HOME=/opt/android-sdk
fi
if [ -e "/usr/libexec/java_home" ]; then
export JAVA_HOME=$(/usr/libexec/java_home)
elif [ -d "/usr/lib/jvm/java-8-openjdk-amd64" ]; then
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
fi
注意自己jdk安装的目录,我的jdk是直接yum安装的,目录跟文档的不一样,
我的jdk目录在/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.181-3.b13.el7_5.x86_64,所以我将划掉部分替换成以下:
JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.181-3.b13.el7_5.x86_64
JRE_HOME=$JAVA_HOME/jre
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME JRE_HOME CLASS_PATH PATH
保存/etc/profile。
再打开~/.bash_profile,添加以下脚本到末尾:(将上述变量添加到环境变量PATH)
if [ -d "$ANDROID_NDK_ROOT" ]; then
export PATH="$PATH:$ANDROID_NDK_ROOT"
fi
if [ -d "$ANDROID_SDK_ROOT/tools/bin" ]; then
export PATH="$PATH:$ANDROID_SDK_ROOT/tools/bin"
fi
if [ -d "$ANDROID_SDK_ROOT/platform-tools" ]; then
export PATH="$PATH:$ANDROID_SDK_ROOT/platform-tools"
fi
保存~/.bash_profile。
七、执行exit退出shell,重新登录。
八、执行echo试试变量是否成功设置。
$ echo $ANDROID_NDK_ROOT
/opt/android-ndk
$ echo $ANDROID_SDK_ROOT
/opt/android-sdk
$ echo $ANDROID_HOME
/opt/android-sdk
$ echo $JAVA_HOME
/usr/lib/jvm/java-8-openjdk-amd64
执行完以上步骤,则编译环境已经成功设置好。接下来编译crypto++库。
首先从github下载给安卓使用的crypto++库:https://github.com/noloader/cryptopp-android
下载后解压,进入cryptopp-android-master/cryptopp-8.2,执行脚本./cryptest-android.sh即可完成编译。
该脚本执行了以下操作:
1、解压了当前路径下的源码压缩包cryptopp820.zip:
2、下载两个文件setenv-android.sh、GNUmakefile-cross到当前目录:(我出现过多次下载失败的情况,多试几次。。)
据https://www.cryptopp.com/wiki/Android_(Command_Line)这个文档解释, 因为Android不断更改KDK?,工具链和工具路径,所以setenv-android.sh需要不断变动来匹配对应的AndroidNDK版本。这可能就是需要实时下载这两个文件的原因吧。
3、将父目录的Android.mk和Application.mk复制到当前目录,修改一些宏定义,然后遍历四个平台armeabi-v7a arm64-v8a x86 x86_64,使用ndk-build为这些平台执行编译:
问题点:我在centos6.8上执行的时候报找不到/lib64/libc.so.6: version `GLIBC_2.14' not found
网友说法:出现这种错误表明程序运行需要GLIBC_2.14,但是系统中却并不存在,因此可以先用strings命令查看下系统中的GLIBC版本:
strings /lib64/libc.so.6 | grep GLIBC
我发现我的centos6.8系统中确实没有这个版本,于是我换了centos7查看了下,有这个版本。为避免产生更多问题,所以我直接在centos7上执行编译了。
等待良久,成功编译通过。
在以下目录成功生成了动态库和静态库:
到此给安卓使用的crypto++库编译完成。
最后,我将库导入到android studio使用的过程中也遇上了不少问题,下回再介绍导入和使用库的过程。