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 ~