Android下使用Openssl庫
阿新 • • 發佈:2020-07-24
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 5.6.4,gradle plugin3.4.2),複製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})