Sir zach

专注于算法,AI, Android以及音视频领域 欢迎关注我的最新博客: zachliu.cn

导航

【原创】GmSSL Android库编译

Posted on 2021-05-08 17:26  SirZach  阅读(1183)  评论(0编辑  收藏  举报

相关内容:

GmSSL Linux编译 环境搭建


重要

用编译方法2编译出的库,集成到工程之后,发现报 incompatible target错误,各种找不到定义。32位和64位都不行。 如果你也遇到跟我一样的问题。 只能用下面的方法重新编译

编译方法1:

编译环境
  • gmssl 2.5.4
  • OpenSSL 1.1.0d
  • wsl ubuntu 20.04
  • ndk-r21e

参考:
NDK开发 - 使用GMSSL库和OpenSSL库的注意点及编译
GmSSL的编译和使用

脚本参考:https://github.com/wangp8895/gmssl-for-android

编译中间出现下面的报警
image
原因是根据独立工具链(已弃用) 的说明,从r19开始,已弃用独立工具链。可以不用管

由于编译出很多文档,耗时比较长,可能要1-2小时。将编译脚本放到解压后的GmSSL-master同级目录,使用./build-gmssl4android.sh android64-aarch64 启动编译,在你指定的out/libs目录中, 会生成以下文件:
image
lib包含:
image

这次终于可以正常使用了。


编译方法2:

编译环境
  • wsl ubuntu 20.04
  • ndk-r21b
    官方给出了一个编译脚本, 可以稍微参考一下,我是没编译通过。

以下为编译脚本, 参考地址

#!/bin/bash
set -ex

# Set directory
CURRENT_PATH=`pwd`
SCRIPTPATH=$CURRENT_PATH/out
export NDK=/mnt/e/Android/android-ndk-r21b
export OPENSSL_DIR=$CURRENT_PATH

# Find the toolchain for your build machine
toolchains_path=$NDK/toolchains/llvm/prebuilt/linux-x86_64

# Configure the OpenSSL environment, refer to NOTES.ANDROID in OPENSSL_DIR
# Set compiler clang, instead of gcc by default
CC=clang

# Add toolchains bin directory to PATH
PATH=$toolchains_path/bin:$PATH

# Set the Android API levels
ANDROID_API=21

# Set the target architecture
# Can be android-armeabi, android64-aarch64, android-x86, android-x86 etc

# armeabi-v7a
outdir=arm64-v8a   

# android-armeabi
architecture=android64-aarch64

# Create the make file
cd ${OPENSSL_DIR}

./Configure ${architecture} -D__ANDROID_API__=$ANDROID_API no-asm no-unit-test no-serpent

#./config no-ssl2 no-ssl3 no-comp no-hw no-engine \
#--openssldir=$(pwd)/../out/$ANDROID_API \
#--prefix=$(pwd)/../out/$ANDROID_API

# Build
make -j4

# Copy the outputs
OUTPUT_INCLUDE=$SCRIPTPATH/output/include
OUTPUT_LIB=$SCRIPTPATH/output/lib/${outdir}
mkdir -p $OUTPUT_INCLUDE
mkdir -p $OUTPUT_LIB
cp -RL include/openssl $OUTPUT_INCLUDE
cp libcrypto.so $OUTPUT_LIB
cp libcrypto.a $OUTPUT_LIB
cp libssl.so $OUTPUT_LIB
cp libssl.a $OUTPUT_LIB

配置信息:
image
image

生成的Makefile中交叉编译配置:
image

这里我尝试后,编译器和TOOLCHAIN_PATH不设置也能编译成功。在目标目录下会生成include 和lib文件
image

你可能会遇到的其他问题:

  • make发现找不到 asm/types.h
    image

然后发现 sysroot/usr/include下并没有asm目录,只有asm-generic。 我发现在include的arm-linux-androideabi下是存在asm目录的。 所以想法就是将这个目录添加到搜索头文件中。 开始想export CFLAGS进去,但是死活无法生效,尝试几次无果。
image

最后添加了一个软连接来实现
ln -s $ANDROID_PATH/sysroot/usr/include/arm-linux-androideabi/asm $ANDROID_PATH/sysroot/usr/include/asm

  • 错误: [Makefile.shared:197: link_shlib.linux-shared] Error 1
    这里 的方案是设置EX_LIBS为空, 但始终无法生效。 最后通过
make clean
make update
make

来解决的。


参考文档

GmSSL Android 交叉编译 多平台
OpenSSL的编译和使用
在Linux下安装GmSSL