【国家機密】LibcurlのAndroidライブラリのコンパイル手順と詳細解説

I. 概要

この記事では、Android libcurl 国家機密ライブラリのコンパイル プロセスと使用法について詳細に説明することを目的としています。
国家機密アルゴリズム (SM2/SM3/SM4) は、中国国家暗号局によって発行された暗号化アルゴリズム標準です。libcurl を使用します。ライブラリは、複数のプロトコルをサポートする広く使用されているネットワーク送信ライブラリであるため、国家秘密通信を実現するには、libcurl ライブラリを国家秘密アルゴリズムと組み合わせて使用​​する必要があります~

よし、行きましょう〜

2. コンパイルプロセス

筆者の環境:
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
make
make install

ok~ この時点で、gmssl のコンパイルは完了です。

4. libcurlをコンパイルする

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

libcurl ソース コード ディレクトリに移動し、コンパイル出力フォルダーを作成し、次のコマンドを実行します。

cd curl
mkdir build-android
cd build-android

build.sh スクリプト ファイルを作成し、次の内容をファイルにコピーします。

#!/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

最後に、スクリプトに実行権限を与えて ~ を実行します。

chmod +x build.sh
./build.sh

この時点で、コンパイルされた libcurl は、output/android ディレクトリに配置されます~

3. 詳しい説明

1. コンパイルされた libcurl ライブラリと GmSSL ライブラリを Android プロジェクトに追加します。

GmSSL ライブラリのインクルード フォルダーを 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 プロジェクトで使用することができました~

4つ目、ついに

ご質問がございましたら、お気軽にコメントしてご連絡ください〜

おすすめ

転載: blog.csdn.net/a_Chaon/article/details/130563705