[국가비밀] Libcurl의 안드로이드 라이브러리 컴파일 과정 및 자세한 설명

I. 개요

이 글은 Android libcurl 국가비밀 라이브러리의 컴파일 과정과 사용에 대한 자세한 설명을 제공하는 것을 목표로 합니다.국가
비밀 알고리즘(SM2/SM3/SM4)은 중국 국가암호국에서 발행한 암호화 알고리즘 표준입니다. 라이브러리, 다중 프로토콜을 지원하는 널리 사용되는 네트워크 전송 라이브러리이기 때문에 국가 비밀 통신을 달성하려면 국가 비밀 알고리즘과 결합하여 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. Android 프로젝트에 컴파일된 libcurl 라이브러리 및 GmSSL 라이브러리를 추가합니다.

GmSSL 라이브러리의 include 폴더를 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);
    }
}

지금까지 안드로이드 libcurl 국가비밀라이브러리를 성공적으로 컴파일하여 국가비밀통신을 위한 안드로이드 프로젝트에 활용하였습니다~

넷, 드디어

궁금하신 사항은 댓글 및 연락주세요~

추천

출처blog.csdn.net/a_Chaon/article/details/130563705