我的应用程序无法在 Android 上使用 OpenSSL 进行链接

dav*_*oze 3 c++ android openssl android-ndk

我使用david-hoze/build-openssl-android在我的 Android 项目中包含 OpenSSL :使用 android ndk r17 构建 openssl 1.1.0h。.

这是我的设置:Android Studio 3.2 NDK 版本:18.0.5002713

这是我的应用程序build.gradle文件:

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'

def my_openssl_dir = getRootDir().toString() + "/build-openssl-android/openssl-lib"

android {
    compileSdkVersion 27
    defaultConfig {
        applicationId "com.my-company.my-app"
        minSdkVersion 21
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        externalNativeBuild {
            cmake {
                cppFlags "-std=c++17 -frtti -fexceptions"
                arguments '-DANDROID_STL=c++_shared'
                arguments '-DMY_OPENSSL_DIR=' + my_openssl_dir
            }
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }

    sourceSets {
        main {
            jniLibs.srcDirs = [
            ]
        }

    }
}

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
    implementation 'com.android.support:appcompat-v7:27.1.1'
    implementation 'com.android.support.constraint:constraint-layout:1.1.1'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    implementation 'org.jetbrains.kotlin:kotlin-reflect:1.2.30'
}
Run Code Online (Sandbox Code Playgroud)

这是我的CMakeLists.txt文件:

cmake_minimum_required(VERSION 3.4.1)
include_directories( src/main/cpp/
                   )

add_library( # Sets the name of the library.
             my-library

             SHARED

             src/main/cpp/my-code.cpp
             )

find_library (log-lib log)

add_library(libcrypto STATIC IMPORTED)
set_target_properties(libcrypto PROPERTIES IMPORTED_LOCATION
${MY_OPENSSL_DIR}/${ANDROID_ABI}/libcrypto.a)

add_library(libssl STATIC IMPORTED)
set_target_properties(libssl PROPERTIES IMPORTED_LOCATION
${MY_OPENSSL_DIR}/${ANDROID_ABI}/libssl.a)

target_include_directories(nativ PRIVATE
                       ${MY_OPENSSL_DIR}/${ANDROID_ABI}/include
                       )

target_link_libraries( # Specifies the target library.
                       my-library
                       libcrypto
                       libssl
                       ${log-lib}
                       )
Run Code Online (Sandbox Code Playgroud)

我在编译时收到这些错误:

构建命令失败。使用参数执行进程 /home/david/Android/Sdk/cmake/3.6.4111459/bin/cmake 时出错 {--build /home/david/dev/android/MyApplication/app/.externalNativeBuild/cmake/debug/x86_64 - -target my-library} [1/1] 链接 CXX 共享库 ../../../../build/intermediates/cmake/debug/obj/x86_64/libnativ.so FAILED: : && /home/david /Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++ --target=x86_64-none-linux-android21 --gcc-toolchain=/home/david/Android/Sdk/ndk- bundle/toolchains/x86_64-4.9/prebuilt/linux-x86_64 --sysroot=/home/david/Android/Sdk/ndk-bundle/sysroot -fPIC -isystem /home/david/Android/Sdk/ndk-bundle/sysroot/ usr/include/x86_64-linux-android -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -Wa,

感谢您的帮助。

dav*_*oze 7

问题是链接顺序,我改的顺序libssl,并libcrypto在我的CMakelists.txt文件,像这样:

cmake_minimum_required(VERSION 3.4.1)
include_directories( src/main/cpp/
                   )

add_library( # Sets the name of the library.
             my-library

             SHARED

             src/main/cpp/my-code.cpp
             )

find_library (log-lib log)

add_library(libcrypto STATIC IMPORTED)
set_target_properties(libcrypto PROPERTIES IMPORTED_LOCATION
${MY_OPENSSL_DIR}/${ANDROID_ABI}/libcrypto.a)

add_library(libssl STATIC IMPORTED)
set_target_properties(libssl PROPERTIES IMPORTED_LOCATION
${MY_OPENSSL_DIR}/${ANDROID_ABI}/libssl.a)

target_include_directories(nativ PRIVATE
                       ${MY_OPENSSL_DIR}/${ANDROID_ABI}/include
                       )

target_link_libraries( # Specifies the target library.
                       my-library
                       libssl
                       libcrypto
                       ${log-lib}
                       )
Run Code Online (Sandbox Code Playgroud)

它编译得很好