I. Übersicht
Ziel dieses Artikels ist es, den Kompilierungsprozess und die Verwendung der Android libcurl National Secret Library ausführlich zu erläutern. Der
National Secret Algorithmus (SM2/SM3/SM4) ist ein kryptografischer Algorithmusstandard, der von der State Cryptography Administration of China herausgegeben wird. Verwenden Sie libcurl Bibliothek, da es sich um eine weit verbreitete Netzwerkübertragungsbibliothek handelt, die mehrere Protokolle unterstützt. Sie müssen daher die libcurl-Bibliothek in Kombination mit dem nationalen Geheimalgorithmus verwenden, um eine nationale geheime Kommunikation zu erreichen ~
Ok, lass uns gehen
2. Kompilierungsprozess
Die Umgebung des Autors:
Windows-Version: Windows 10
Android NDK-Version: r21 oder höher
1. Bereiten Sie die Umgebung vor
确保已安装 Android NDK,设置好ANDROID_NDK_HOME环境变量(此处不再赘述,基本功哈...)
2. Besorgen Sie sich den GmSSL-Quellcode
git clone https://github.com/guanzhi/GmSSL.git
3. Kompilieren Sie GmSSL
Geben Sie zuerst den Ordner gmssl ein und erstellen Sie dann den Ordner „build-android“. Der Zweck der Erstellung dieses Ordners besteht darin, eine kompilierte Ausgabedatei zu erstellen und diese schließlich auszuführen
./setenv-android.sh
Führen Sie dann den folgenden Befehl aus
make clean
make
make install
ok~ Zu diesem Zeitpunkt ist die Kompilierung von gmssl abgeschlossen.
4. Kompilieren Sie libcurl
git clone https://github.com/curl/curl.git
Geben Sie das Quellcodeverzeichnis von libcurl ein, erstellen Sie einen Kompilierungsausgabeordner und führen Sie den folgenden Befehl aus
cd curl
mkdir build-android
cd build-android
Erstellen Sie eine build.sh-Skriptdatei und kopieren Sie den folgenden Inhalt in die Datei
#!/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
Geben Sie abschließend dem Skript ausführbare Berechtigungen und führen Sie ~ aus
chmod +x build.sh
./build.sh
Zu diesem Zeitpunkt befindet sich die kompilierte libcurl im Verzeichnis „output/android“~
3. Ausführliche Erklärung
1. Fügen Sie die kompilierte libcurl-Bibliothek und die GmSSL-Bibliothek zum Android-Projekt hinzu:
Kopieren Sie den Include-Ordner der GmSSL-Bibliothek in das Verzeichnis jni des Android-Projekts.
Kopieren Sie die kompilierte libcurl-Bibliothek (libcurl.a) und die GmSSL-Bibliothek (libcrypto.a, libssl.a) in das Verzeichnis jni/libs des Android-Projekts
2. Erstellen Sie eine Android.mk-Datei:
Erstellen Sie eine Datei mit dem Namen Android.mk im jni-Verzeichnis und kopieren Sie den folgenden Inhalt in die Datei:
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. Lokalen Code schreiben:
In der Datei my_native_module.c können Sie die libcurl-Bibliothek und die GmSSL-Bibliothek für die nationale geheime Kommunikation verwenden. Verwenden Sie beispielsweise eine HTTPS-GET-Anfrage:
#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. Rufen Sie die lokale Methode im Android-Projekt auf:
Rufen Sie die lokale Methode in MainActivity.java auf, wie unten gezeigt
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);
}
}
Bisher haben Sie die nationale Geheimbibliothek Android libcurl erfolgreich kompiliert und im Android-Projekt für nationale Geheimkommunikation ~ verwendet
Vier, endlich
Wenn Sie Fragen haben, können Sie gerne einen Kommentar abgeben und mich kontaktieren ~