[Secreto nacional] Proceso de compilación de la biblioteca Android de Libcurl y explicación detallada

I. Resumen

Este artículo tiene como objetivo proporcionar una explicación detallada del proceso de compilación y el uso de la biblioteca secreta nacional libcurl de Android. El
algoritmo secreto nacional (SM2/SM3/SM4) es un estándar de algoritmo criptográfico emitido por la Administración Estatal de Criptografía de China. Utilice libcurl biblioteca, porque es una biblioteca de transmisión de red ampliamente utilizada que admite múltiples protocolos, por lo que debe usar la biblioteca libcurl en combinación con el algoritmo secreto nacional para lograr la comunicación secreta nacional ~

ok, vamos~

2. Proceso de compilación

Entorno del autor:
Versión de Windows: Windows 10
Versión de Android NDK: r21 o posterior

1. Preparar el entorno

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

2. Obtenga el código fuente de GmSSL

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

3. Compilar GmSSL

Primero ingrese a la carpeta gmssl, luego cree la carpeta 'build-android', el propósito de crear esta carpeta es crear un archivo de salida compilado y finalmente ejecutar

./setenv-android.sh

Luego ejecuta el siguiente comando

make clean
make
make install

ok~ En este punto, la compilación de gmssl está completa;

4. Compilar libcurl

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

Ingrese al directorio del código fuente de libcurl, cree una carpeta de salida de compilación y ejecute el siguiente comando

cd curl
mkdir build-android
cd build-android

Cree un archivo de script build.sh y copie el siguiente contenido en el archivo

#!/bin/bash

export ANDROID_NDK_HOME=你的Android_NDK路径
export GmSSL_INSTALL_DIR=你的GmSSL安装目录

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

export PATH=${TOOLCHAIN}/bin:$PATH
export CC=${TOOLCHAIN}/bin/armv7a-linux-androideabi${API_LEVEL}-clang
export CXX=${TOOLCHAIN}/bin/armv7a-linux-androideabi${API_LEVEL}-clang++
export AR=${TOOLCHAIN}/bin/arm-linux-androideabi-ar
export LD=${TOOLCHAIN}/bin/arm-linux-androideabi-ld
export RANLIB=${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

make
make install

Finalmente, otorgue permisos ejecutables al script y ejecute ~

chmod +x build.sh
./build.sh

En este punto, el libcurl compilado se ubicará en el directorio de salida/android~

3. Explicación detallada

1. Agregue la biblioteca libcurl compilada y la biblioteca GmSSL al proyecto de Android:

Copie la carpeta de inclusión de la biblioteca GmSSL en el directorio jni del proyecto Android
Copie la biblioteca libcurl compilada (libcurl.a) y la biblioteca GmSSL (libcrypto.a, libssl.a) en el directorio jni/libs del proyecto Android

2. Cree un archivo Android.mk:
cree un archivo llamado Android.mk en el directorio jni y copie el siguiente contenido en el archivo:

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. Escriba el código local:
en el archivo my_native_module.c, puede usar la biblioteca libcurl y la biblioteca GmSSL para la comunicación secreta nacional. Por ejemplo, usando una solicitud 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. Llame al método local en el proyecto de Android:
llame al método local en MainActivity.java, como se muestra a continuación

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);
    }
}

Hasta ahora, ha compilado con éxito la biblioteca secreta nacional libcurl de Android y la ha utilizado en el proyecto Android para la comunicación secreta nacional~

Cuatro, finalmente

Si tiene alguna pregunta, no dude en comentar y ponerse en contacto conmigo ~

Supongo que te gusta

Origin blog.csdn.net/a_Chaon/article/details/130563705
Recomendado
Clasificación