环境
- 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.mk
和Application.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路径