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.
来覆盖它
我正在开发一个使用某些第 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.
来覆盖它