I. Aperçu
Cet article vise à fournir une explication détaillée du processus de compilation et de l'utilisation de la bibliothèque secrète nationale Android libcurl. L'
algorithme secret national (SM2/SM3/SM4) est une norme d'algorithme cryptographique publiée par l'Administration de cryptographie d'État de Chine. bibliothèque, car il s'agit d'une bibliothèque de transmission réseau largement utilisée qui prend en charge plusieurs protocoles, vous devez donc utiliser la bibliothèque libcurl en combinaison avec l'algorithme secret national pour obtenir une communication secrète nationale ~
d'accord, allons-y ~
2. Processus de compilation
Environnement de l'auteur :
Version Windows : Windows 10
Version Android NDK : r21 ou ultérieure
1. Préparer l'environnement
确保已安装 Android NDK,设置好ANDROID_NDK_HOME环境变量(此处不再赘述,基本功哈...)
2. Obtenir le code source GmSSL
git clone https://github.com/guanzhi/GmSSL.git
3. Compiler GmSSL
Entrez d'abord dans le dossier gmssl, puis créez le dossier 'build-android', le but de la création de ce dossier est de créer un fichier de sortie compilé, et enfin d'exécuter
./setenv-android.sh
Exécutez ensuite la commande suivante
make clean
make
make install
ok~ À ce stade, la compilation de gmssl est terminée ;
4. Compiler libcurl
git clone https://github.com/curl/curl.git
Entrez dans le répertoire du code source de libcurl, créez un dossier de sortie de compilation et exécutez la commande suivante
cd curl
mkdir build-android
cd build-android
Créez un fichier de script build.sh et copiez le contenu suivant dans le fichier
#!/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
Enfin, donnez au script des autorisations exécutables et exécutez ~
chmod +x build.sh
./build.sh
À ce stade, le libcurl compilé sera situé dans le répertoire output/android ~
3. Explication détaillée
1. Ajoutez la bibliothèque compilée libcurl et la bibliothèque GmSSL au projet Android :
Copiez le dossier include de la bibliothèque GmSSL dans le répertoire jni du projet Android
Copiez la bibliothèque compilée libcurl (libcurl.a) et la bibliothèque GmSSL (libcrypto.a, libssl.a) dans le répertoire jni/libs du projet Android
2. Créez un fichier Android.mk :
créez un fichier nommé Android.mk dans le répertoire jni et copiez le contenu suivant dans le fichier :
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. Écrivez le code local :
Dans le fichier my_native_module.c, vous pouvez utiliser la bibliothèque libcurl et la bibliothèque GmSSL pour la communication secrète nationale. Par exemple, en utilisant une requête 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. Appelez la méthode locale dans le projet Android :
appelez la méthode locale dans MainActivity.java, comme indiqué ci-dessous.
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);
}
}
Jusqu'à présent, vous avez compilé avec succès la bibliothèque secrète nationale Android libcurl et l'avez utilisée dans le projet Android pour la communication secrète nationale ~
Quatre, enfin
Si vous avez des questions, n'hésitez pas à commenter et à me contacter ~