Android NDK - 从源代码构建共享库

Android NDK - Build shared library from source code

我正在开发一个使用某些第 3 方本机库的 Android 应用程序。我们需要为这些库添加一些功能。所以我用我需要的代码写了一套 C++ 类 和 cross-compile openssl,因为我们正在使用 openssl 加密函数。

我制作了一个演示应用程序来测试我的代码,一切正常。

现在我需要将此代码发送给正在开发 3rd 方库的人员,他们将添加我们的代码并将所有本机代码包装在一个 JAR 中,以便我们在我们的应用程序中使用它。

我以这个例子 NDK hello libs 为基础。因为我想将我的代码作为共享库(.so 文件)发送,所以我在 'CMakeList.txt':

cmake_minimum_required(VERSION 3.4.1)

set(distribution_DIR ${CMAKE_SOURCE_DIR}/../distribution)

add_library(lib_crypto STATIC IMPORTED)
set_target_properties(lib_crypto PROPERTIES IMPORTED_LOCATION
    ${distribution_DIR}/openssl/lib/${ANDROID_ABI}/libcrypto.a)

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

### This code just calls my my-lib ###
add_library(native-lib SHARED
        src/main/cpp/native-lib.cpp)

### This is the lib I want to build ###
add_library(my-lib SHARED
         src/main/cpp/*****.cpp
         # more files...
         )

target_include_directories(my-lib PRIVATE ${distribution_DIR}/openssl/include)

target_link_libraries(
                native-lib
                my-lib
                )

target_link_libraries(
                neclic
                lib_crypto
                )

我构建了 APK 并从中获取了 'my-lib.so'。然后我使用这个库创建了一个新项目(包括 .h headers),一切都按预期工作。

我的问题是: 有更好的方法吗?当我发送这个库与原始代码集成时,我可能会遇到任何问题吗?例如,他们是否需要使用相同的 NDK 版本?如果支持 arch,'my-lib.so' 可以在任何 android 应用程序中使用吗?

谢谢!

一般来说,您不需要将 libneclic.so 打包到 JAR 中。您可以在您的 APK 中按原样使用它 ,除非您的同事在外部开发的第 3 方库需要您的库作为依赖项。

实际上,支持分发带有本机组件的已编译 Java 库的方法不是 JAR,而是 AAR 文件。但这是一个技术问题,对于本次讨论并不重要。

如果您直接在您的 APK 中使用 libneclic.so,即您有 Java class(es) 使用 JNI要调用你的库中的函数,你可以在你的项目中保持相同的 CMakeList.txt,或者你可以将构建的库放在 JniLibs 文件夹,Android Studio 会在打包 APK 时从那里选择它。

另一方面,如果您构建的库具有将从某些第 3 方库调用的导出函数,请确保两者使用相同的共享 STL(幸运的是,最新的 NDK 版本 18,只有一个共享 STL 实现可用,c++_shared.

强烈建议使用相同的 NDK 版本构建库,即使这些版本之间的适度差异很可能不会导致负面结果。每个 NDK 版本都带来了重大改进,不仅在性能方面,而且还修复了错误,包括一些安全问题。

尽管如此,就 NDK 的通用旧版本达成一致比跟踪所有可能的不一致更安全。

请注意,默认情况下,CMake 使用 c++_static STL 来构建您的 libneclic.so ,您必须通过设置 ANDROID_STL.

来覆盖它