首页 > 解决方案 > 如何在没有额外 CMake 库的情况下将预制库中的预构建库嵌入到 APK 中?

问题描述

我需要在 APK 中包含 libcrypto.so 库,因此可以使用DynamicLibrary.open(在内部使用 dlopen)在 Dart (Flutter) 中打开该库。

com.android.ndk.thirdparty:openssl:1.1.1g-alpha-1 包为 libcrypto.so 提供了预制件,因此我将包包含在 build.gradle 中:

android {
    buildFeatures {
        prefab true
    }
}

dependencies {
    implementation "com.android.ndk.thirdparty:openssl:1.1.1g-alpha-1"
}

但是,这还不足以在 APK 中实际包含库。我需要使用 CMake 添加另一个本机库(empty.c 是一个空文件):

cmake_minimum_required(VERSION 3.6)
project(include_openssl_crypto)
find_package(openssl REQUIRED CONFIG)
add_library(${PROJECT_NAME} SHARED empty.c)
target_link_libraries(${PROJECT_NAME} PRIVATE openssl::crypto)

并将其包含在 build.gradle 中:

android {
    defaultConfig {
        externalNativeBuild {
            cmake {
                arguments "-DANDROID_STL=c++_shared"
            }
        }
    }

    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }
}

然后,libcrypto.so 包含在 APK 中,也是一个很小的,没用的 libinclude_openssl_crypto.so。

如何防止 CMake 实际生成另一个库?我试过to add_custom_target,但这还不足以在 APK 中包含 libcrypto.so。或者,如何在没有 CMake 的情况下从预制中包含 libcrypto.so?add_dependenciesopenssl::crypto

标签: androidcmakeandroid-ndk

解决方案


推荐阅读