我正在开发一个使用某些第 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/