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

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

我正在开发一个使用某些第 3 方 native 库的 Android 应用程序。我们需要为这些库添加一些功能。所以我用我需要的代码编写了一组 C++ 类,并且还交叉编译了 openssl,因为我们正在使用 openssl 加密函数。

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

现在我需要将此代码发送给正在开发 3rd 方库的人员,他们将添加我们的代码并将所有 native 代码包装在一个 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 header )创建了一个新项目,一切都按预期工作。

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

谢谢!

最佳答案

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

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

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

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

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

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

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

关于Android NDK - 从源代码构建共享库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53051745/

相关文章:

Android:获取支持的视频尺寸

c++ - 使用CMake添加C++编译器标志

c++ - 使用 CMake 为 MonoDevelop 生成项目文件

cmake - 将ExternalProject 下载步骤与Ninja 一起使用

android - 添加导航栏后 TabLayout 不显示选项卡

java - 通过 ActionBarActivity 支持 v7 操作栏

java - 在 RecyclerView 中显示 Firestore 集合的问题

c++ - 在 Windows 中的 Qt 中加载外部 dll

C++ : class A reference classe B (in a vector) and class B reference A (only one)

c++ - 对 C++ 中的链接器感到困惑