【问题标题】:Android NDK - Build shared library from source codeAndroid NDK - 从源代码构建共享库
【发布时间】:2018-10-29 18:31:53
【问题描述】:

我正在开发一个使用一些 3rd 方原生库的 Android 应用。我们需要为这些库添加一些功能。所以我用我需要的代码编写了一组 C++ 类,并交叉编译了 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 头文件)创建了一个新项目,一切都按预期工作。

我的问题是: 有没有更好的方法来做到这一点?当我将此库与原始代码集成时,我可能会遇到任何问题吗?例如,他们是否需要使用相同的 NDK 版本?或者“my-lib.so”可以在任何安卓应用中使用(如果支持拱门)?

谢谢!

【问题讨论】:

  • 欢迎来到 Stack Overflow!在这里,我们可以帮助您修复代码中的错误,但有关代码改进的问题应该在Code Review 上提出

标签: android c++ cmake android-ndk .so


【解决方案1】:

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

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

如果您直接在 APK 中使用 libneclic.so,也就是说,您有使用 JNI 调用库中函数的 Java 类,您可以保持相同的 CMakeList.txt 在您的项目中,或者您可以将构建的库放在 JniLibs 文件夹中,Android Studio 会在打包 APK 时从那里提取它。

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

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

不过,与跟踪所有可能的不一致之处相比,就 NDK 的常见旧版本达成一致更安全。

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

【讨论】:

  • 感谢您的回答!正是他们需要使用我的 lib 作为依赖项。我们无法在 JAR 或 AAR 之间进行选择,它们“按原样”提供包装器。将源代码处理给他们并让他们一起构建一切会更好吗?
  • 哦,是的,如果你有能力提供你的源代码,它会为你省去很多麻烦。
  • 将代码保存在单独的共享库中的一个好处是:您可以单独更新它,只要与第 3 方的公共接口保持不变。
猜你喜欢
  • 2012-06-03
  • 2016-01-28
  • 2013-04-05
  • 2014-03-22
  • 1970-01-01
  • 1970-01-01
  • 2015-04-26
  • 2018-02-20
  • 1970-01-01
相关资源
最近更新 更多