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

时间:2018-10-29 18:31:53

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

我正在开发一个使用一些第三方第三方库的Android应用。我们需要向这些库添加一些功能。因此,当我们使用openssl加密函数时,我用所需的代码编写了一组C ++类,并且还交叉编译了openssl。

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

现在,我需要将此代码发送给正在开发第三方库的人员,他们将添加我们的代码并将所有本机代码包装在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”。然后,我使用此lib(并包括.h标头)创建了一个新项目,一切按预期进行。

我的问题是: 有更好的方法吗?发送此库与原始代码集成时,可能会出现任何问题吗?例如,他们是否需要使用相同的NDK版本?如果支持拱门,则可以在任何Android应用中使用“ my-lib.so”?

谢谢!

1 个答案:

答案 0 :(得分:0)

通常来说,您无需发送 libneclic.so 即可将其打包为JAR。您可以直接在APK 中使用它,除非您的同事开发的第三方库需要您的库作为依赖项。

实际上,使用本机组件分配已编译Java库的受支持方法不是JAR,而是AAR文件。但这对本次讨论并不重要。

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

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

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

不过,相比于跟踪所有可能的不一致之处,达成共识的较老版本的NDK更安全。

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