【问题标题】:Android NDK cmake and dependent librariesAndroid NDK cmake 和依赖库
【发布时间】:2017-01-22 13:52:31
【问题描述】:
我想在我的 JNI 代码中使用一个库(来自 GH 的源代码)。但该库依赖于 Android NDK 中不可用的另外两个库(NTL 和 Boost)。
现在我有点困惑,不确定我是否正确理解了我的以下操作。
适用于 Android 的 C++ 代码内置于每个平台(x86_64、armv7..)的共享库 (.so) 中。这是否意味着我想使用的 NTL、Boost 和 lib 也必须由我从这些平台的源代码编译?如果是,如何正确使用 cmake?
如果我应该为特定平台构建所有库,最好是作为静态库(.a + 标头)还是作为共享库?
我真的需要为所有平台构建 NTL 和 Boost,还是应该只为所需的库构建 NTL 和 Boost?
需要 Android.mk 文件还是可以帮助 cmake?据我了解,它仅与“ndk-build”一起使用。
一般来说,这一系列动作是否正确?
- 为所有平台构建 NTL(.a + 标头)
- 为所有平台构建 Boost(.a + 标头)
- 为所有平台构建库 (.so)
- 在 JNI 项目的 CMakeLists 中添加库的 .so 文件作为依赖项。 (我是否还需要依赖库和头文件,或者依赖项将被封装到 lib 中?)
【问题讨论】:
标签:
c++
boost
android-ndk
cmake
java-native-interface
【解决方案1】:
适用于 Android 的 C++ 代码内置于每个平台(x86_64、armv7..)的共享库 (.so) 中。这是否意味着我想使用的 NTL、Boost 和 lib 也必须由我从这些平台的源代码编译?如果是,如何正确使用 cmake?
是的,如果您想在您的应用程序中使用这些库,您需要从源代码构建这些库(或查找适用于 Android 的二进制发行版)。至于如何做到这一点,您将不得不等待其他人回答或尝试谷歌搜索。那里有一些“如何为 Android 构建 X”教程,但我不知道你是否会找到很多关于 CMake 的教程,因为 CMake 对于 Android 来说是相当新的。
如果我应该为特定平台构建所有库,最好是作为静态库(.a + 标头)还是作为共享库?
这主要取决于您为应用构建了多少共享库。应用程序的理想模型是在您的应用程序中使用单个共享库并静态链接所有依赖项(以避免旧版本 Android 上的链接器错误,并使您的应用程序尽可能小)。如果您的代码有多个共享库,则需要为依赖项使用共享库以避免 ODR 问题。
我真的需要为所有平台构建 NTL 和 Boost,还是应该只为所需的库构建 NTL 和 Boost?
您需要在任何需要使用这些库的平台上执行此操作。
需要 Android.mk 文件还是可以帮助 cmake?据我了解,它仅与“ndk-build”一起使用。
CMake 和 ndk-build 应该都可以工作,但是由于 CMake 在 Android 中的相对年轻,您可能更容易找到 ndk-build 的移植说明。