0


【国密】Libcurl的Android库编译流程及使用详解

一、概述

本文旨在提供一个Android libcurl 国密库的编译流程和使用详解
国密算法(SM2/SM3/SM4)是中国国家密码管理局颁布的密码算法标准,用于安全通信、数字签名等领域,本文将使用libcurl库,因为它是一个广泛使用的,支持多种协议的网络传输库,所以需要将libcurl库与国密算法结合使用以实现国密通信~

ok,let’s go~

二、编译流程

本文作者环境:
Windows版本: Windows 10
Android NDK版本:r21或更高版本

1.准备环境

确保已安装 Android NDK,设置好ANDROID_NDK_HOME环境变量(此处不再赘述,基本功哈...)

2.获取GmSSL源码

git clone https://github.com/guanzhi/GmSSL.git

3.编译GmSSL

首先进入gmssl文件夹中, 然后创建 ‘build-android’文件夹, 创建该文件夹的目的在于创建编译输出文件,最后执行

./setenv-android.sh

然后运行以下命令

make clean
makemakeinstall

ok~ 至此gmssl的编译就算完成;

4.编译Libcurl

git clone https://github.com/curl/curl.git

进入libcurl源码目录,创建编译输出文件夹,执行以下命令

cdcurlmkdir build-android
cd build-android

创建build.sh脚本文件,并将以下内容复制到文件中

#!/bin/bashexportANDROID_NDK_HOME=你的Android_NDK路径
exportGmSSL_INSTALL_DIR=你的GmSSL安装目录

API_LEVEL=21ANDROID_ABI="armeabi-v7a with NEON"ARCH=arm
PLATFORM=android
TOOLCHAIN=${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64

exportPATH=${TOOLCHAIN}/bin:$PATHexportCC=${TOOLCHAIN}/bin/armv7a-linux-androideabi${API_LEVEL}-clang
exportCXX=${TOOLCHAIN}/bin/armv7a-linux-androideabi${API_LEVEL}-clang++
exportAR=${TOOLCHAIN}/bin/arm-linux-androideabi-ar
exportLD=${TOOLCHAIN}/bin/arm-linux-androideabi-ld
exportRANLIB=${TOOLCHAIN}/bin/arm-linux-androideabi-ranlib

../configure --host=arm-linux-androideabi \
    --enable-static --disable-shared \
    --disable-debug --disable-verbose \
    --disable-curldebug \
    --enable-http --disable-ftp --disable-file --disable-ldap --disable-ldaps --disable-rtsp --disable-proxy --disable-dict --disable-telnet --disable-tftp --disable-pop3 --disable-imap --disable-smb --disable-smtp --disable-gopher --disable-manual \
    --disable-sspi --disable-ntlm-wb --disable-tls-srp \
    --disable-crypto-auth --disable-ntlm --disable-cookies \
    --with-ssl=$GmSSL_INSTALL_DIR\
    --without-zlib \
    --without-ca-bundle --without-ca-path \
    --prefix=$(pwd)/../output/android

makemakeinstall

最后,赋予脚本可执行权限,并执行~

chmod +x build.sh
./build.sh

此时,编译后的libcurl将位于output/android目录下~

三、使用详解

1.将编译好的libcurl库与GmSSL库添加到Android项目中:

将GmSSL库的include文件夹复制到Android项目的jni目录下
将编译好的libcurl库(libcurl.a)和GmSSL库(libcrypto.a、libssl.a)复制到Android项目的jni/libs目录下

2.创建Android.mk文件:
在jni目录下创建一个名为Android.mk的文件,将以下内容复制到文件中:

LOCAL_PATH :=$(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := gmssl
LOCAL_SRC_FILES := libs/libcrypto.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := ssl
LOCAL_SRC_FILES := libs/libssl.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE :=curl
LOCAL_SRC_FILES := libs/libcurl.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := my_native_module
LOCAL_SRC_FILES := my_native_module.c
LOCAL_STATIC_LIBRARIES :=curl ssl gmssl
LOCAL_LDLIBS := -llog

include $(BUILD_SHARED_LIBRARY)

3.编写本地代码:
在my_native_module.c文件中,可以使用libcurl库和GmSSL库进行国密通信。例如,使用HTTPS GET请求:

#include <jni.h>#include <string.h>#include <curl/curl.h>

JNIEXPORT jstring JNICALL
Java_com_example_myapp_MainActivity_sendHttpsRequest(JNIEnv *env, jobject instance){
    CURL *curl;
    CURLcode res;

    curl_global_init(CURL_GLOBAL_DEFAULT);curl= curl_easy_init();if(curl){
        curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1L);
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 2L);

        res = curl_easy_perform(curl);if(res != CURLE_OK){return(*env)->NewStringUTF(env, curl_easy_strerror(res));}

        curl_easy_cleanup(curl);}

    curl_global_cleanup();return(*env)->NewStringUTF(env, "Request completed successfully.");}

4.在Android项目中调用本地方法:
在MainActivity.java中调用本地方法,如下所示

public class MainActivity extends AppCompatActivity {
    static {
        System.loadLibrary("my_native_module");}

    public native String sendHttpsRequest();

    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        String result = sendHttpsRequest();
        Log.i("MainActivity", result);}}

至此,您已成功编译Android libcurl 国密库,并在Android项目中使用它进行国密通信~

四、最后

若还有问题随时评论联系我~

标签: android 安全

本文转载自: https://blog.csdn.net/a_Chaon/article/details/130563705
版权归原作者 胖虎哥er 所有, 如有侵权,请联系我们删除。

“【国密】Libcurl的Android库编译流程及使用详解”的评论:

还没有评论