GMSSL 编译 Android端

文章目录

  • 环境
  • 编译so库
  • JNI
  • SONAME

环境

  • Android SDK/NDK
  • shell
  • Mac OX 操作系统

编译so库

针对Android/ARM目标平台,需要先安装Android SDK/NDK。设置交叉编译环境后,可以直接用GmSSL内置的编译系统进行编译。下面的脚本给出了交叉编译的示例,需要根据安装的SDK位置及预计的平台编号修改ANDROID_PATH和PLATFORM_VERSION的值。

创建脚本

#!/bin/bash

# SDK路径 自行修改 例如 /Users/zxs.zl/Library/Android/
ANDROID_PATH=/Users/zxs.zl/Library/Android/

# 平台 自行修改
PLATFORM_VERSION=22 

MAKE_TOOLCHAIN=$ANDROID_PATH/sdk/ndk-bundle/build/tools/make-standalone-toolchain.sh
export TOOLCHAIN_PATH=$ANDROID_PATH/android-toolchain-arm
$MAKE_TOOLCHAIN --arch=arm --platform=android-$PLATFORM_VERSION --install-dir=$TOOLCHAIN_PATH

export MACHINE=armv7
export SYSTEM=android
export ARCH=arm
export CROSS_SYSROOT=$TOOLCHAIN_PATH/sysroot
export TOOL_BASENAME=$TOOLCHAIN_PATH/bin/arm-linux-androideabi
export CC=$TOOL_BASENAME-gcc
export CXX=$TOOL_BASENAME-g++
export LD=$TOOL_BASENAME-ld
export LINK=$CXX
export AR=$TOOL_BASENAME-ar
export RANLIB=$TOOL_BASENAME-ranlib
export STRIP=$TOOL_BASENAME-strip

./config
make

保存到GmSSL源码目录,并执行

$ sh 创建的脚本.sh

JNI

Mac OX 下可以测试通过

在源代码根目录下找到java文件夹,进入,然后创建Android.mkApplication.mk 内容如下(根据 Android平台、API level、CPU架构 自行修改)

Android.mk

# Android.mk

#宏函数 my-dir 将返回当前目录(Android.mk 文件本身所在的目录)的路径。
LOCAL_PATH := $(call my-dir)

# libcrypto
include $(CLEAR_VARS)
LOCAL_MODULE := crypto
LOCAL_SRC_FILES := ../libcrypto.so
include $(PREBUILT_SHARED_LIBRARY)

#libssl
include $(CLEAR_VARS)
LOCAL_MODULE := ssl
LOCAL_SRC_FILES := ../libssl.so
include $(PREBUILT_SHARED_LIBRARY)

#libgmssljni
include $(CLEAR_VARS)

# CPU 系列 arm arm64 x86 x86_64
TARGET_ARCH := arm

#  Android API 级别号
TARGET_PLATFORM := android-22

#模块的名称 生成最终共享库文件名为 lib模块名字.so
LOCAL_MODULE := gmssljni

#头文件搜索路径
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../include 

#源文件 (以空格分隔多个文件)
LOCAL_SRC_FILES := gmssl_err.c GmSSL.c

#需要连接的动态库
LOCAL_SHARED_LIBRARIES := crypto ssl

#帮助系统将所有内容连接到一起  静态库请使用 BUILD_STATIC_LIBRARY
include $(BUILD_SHARED_LIBRARY)

Application.mk

#Application.mk

#Android 版本 最小支持为android-16
APP_PLATFORM := android-16

#指令集
APP_ABI := armeabi-v7a

执行命令

$ /Users/xxx/Library/Android/sdk/ndk-bundle/ndk-build  NDK_PROJECT_PATH=GmSSL源码目录/java  APP_BUILD_SCRIPT=Android.mk路径   NDK_APPLICATION_MK=Application.mk路径

SONAME

以上步骤生成的so文件,默认是带着soname的,这将影响Android的so加载过程(可能导致加载失败)
修改soname,有两种方法:1、可以修改编译参数,2、使用rpl工具

  • 1、修改编译参数:修改Makefile.shared文件,搜索-soname=,删除相应的soname版本号;或者搜索-soname=$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX,替换为-soname=lib$(LIBNAME)_12345.so
    Java加载代码变为:
static {
        System.loadLibrary("crypto_12345");
        System.loadLibrary("ssl_12345");
	    System.loadLibrary("gmssljni");
}
  • 2、按照rpl工具 (brew install rpl) 执行如下命令,去掉版本号
    经验证,此方法在新版NDK 19.2.53456 失效
# 版本号自行修改
 rpl -R -e .so.1.1 "1_1_so"  libcrypto.so
 rpl -R -e .so.1.1 "1_1_so"  libssl.so

Java加载代码变为:

static {
        System.loadLibrary("crypto_1_1");
        System.loadLibrary("ssl_1_1");
	    System.loadLibrary("gmssljni");
}

你可能感兴趣的:(Android)