Android下使用Openssl庫


1.編譯Openssl源代碼,生成.so庫(筆者使用環境為Ubuntu 18.04 amd64 桌面版,android_ndk_r19c 64位版):

    下載Openssl源代碼,進入源碼環境然后運行配置腳本,設置編譯參數,開始編譯:    

    export ANDROID_NDK=/home/gj/android-ndk-r19c
    export PATH=/home/gj/android-ndk-r19c/toolchains/llvm/prebuilt/linux-x86_64/bin:$PATH
    ./Configure android-arm shared
    make SHLIB_EXT=.so -j8

  生成的.so保存一下。如果想生成其他ABI架構的so,可以clean后再配置、編譯:

    make clean
    ./Configure android-arm64 shared
    make SHLIB_EXT=.so -j8

  

2.新建Android項目(注意要選中Native C++這個。筆者使用環境為Android Studio 4.0,JDK1.8,gradle 6.1.1,gradle plugin 4.0.0),復制openssl源代碼目錄下所有頭文件(include目錄),以及上一步生成的所有.so到Android項目中。

項目地址:https://github.com/areful/NdkUseOpenssl

 

native-lib.cpp示例展示了如何使用openssl庫進行RSA加解密、生成簽名並驗證簽名。

 

代碼太多,就不一一列出來內容了,可以clone代碼查看內容,只列一下build.gradle和CMakeLists.txt主要內容:

build.gradle:

android {
    ......

    defaultConfig {
        ......

        externalNativeBuild {
            cmake {
                cppFlags "-std=c++11 -frtti -fexceptions"
                arguments '-DANDROID_STL=c++_shared'
            }
            ndk {
                stl = "c++_shared"
                abiFilters 'x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a'
            }
        }
    }
    ......


    sourceSets {
        main {
            jniLibs.srcDirs = ['${PROJECT_SOURCE_DIR}/libs']
        }
    }

    packagingOptions {
        pickFirst '**/*.so'
    }

    externalNativeBuild {
        cmake {
            path "src/main/cpp/CMakeLists.txt"
            version "3.10.2"
        }
    }


}

  CMakeLists.txt:

# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html

cmake_minimum_required(VERSION 3.4.1)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")

###############################################################
# import openssl library files BEGIN
include_directories(include)

set(SSL_LIB_NAME ssl)
add_library(${SSL_LIB_NAME} SHARED IMPORTED)
set_target_properties(${SSL_LIB_NAME} PROPERTIES IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/libs/${ANDROID_ABI}/lib${SSL_LIB_NAME}.so)

set(CRYPTO_LIB_NAME crypto)
add_library(${CRYPTO_LIB_NAME} SHARED IMPORTED)
set_target_properties(${CRYPTO_LIB_NAME} PROPERTIES IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/libs/${ANDROID_ABI}/lib${CRYPTO_LIB_NAME}.so)
# import openssl library files END
###############################################################

find_library(log-lib log)

add_library(native-lib SHARED
        native-lib.cpp
        native-lib.h
        b64/b64.cpp
        b64/b64.h
        b64/test_b64.cpp
        b64/test_b64.h
        rsa/rsa.cpp
        rsa/rsa.h
        rsa/test_rsa.cpp
        rsa/test_rsa.h
        common.h)

target_link_libraries(
        native-lib
        ssl
        crypto
        ${log-lib})

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM