【原創】GmSSL Android庫編譯


相關內容:

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM