Android NDK cmake和依赖库

时间:2017-01-22 13:52:31

标签: c++ boost android-ndk cmake java-native-interface

我想在我的JNI代码中使用库(来自GH的源代码)。但是该库依赖于Android NDK中不可用的另外两个库(NTL和Boost)。 现在我有点困惑,不确定我是否理解我的以下行为。

  1. Android的C ++代码内置于每个平台的共享库(.so)中(x86_64,armv7 ..)。这是否意味着NTL,Boost和我想要使用的lib必须由我从这些平台的源代码编译?如果是,如何使用cmake正确执行?

  2. 如果我应该为特定平台构建所有的lib,那么如何更好地做,无论是作为静态库(.a + headers)还是作为共享库?

  3. 我是否真的需要为所有平台构建NTL和Boost,或者我应该只针对所需的库进行构建?

  4. 是否需要Android.mk文件或可以帮助cmake?据我所知,它与" ndk-build"一起使用。仅

  5. 一般来说,如果这一系列行动是正确的吗?

    1. 为所有平台构建NTL(.a +标头)
    2. 为所有平台构建Boost(.a +标头)
    3. 为所有平台构建库(.so)
    4. 将库的.so文件添加为Jake项目的CMakeLists中的依赖项。 (我是否仍然需要依赖的lib和头文件,或者依赖项将被封装到lib中?)

1 个答案:

答案 0 :(得分:1)

  

Android的C ++代码内置于每个平台的共享库(.so)中(x86_64,armv7 ..)。这是否意味着NTL,Boost和我想要使用的lib必须由我从这些平台的源代码编译?如果是,请问如何使用cmake正确执行?

是的,如果要在应用程序中使用这些库,则需要从源代码构建这些库(或查找Android的二进制分发版)。至于如何做到这一点,你必须等待别人回答或尝试谷歌搜索它。还有一些"如何为Android构建X"那里的教程,但我不知道你是否会为CMake找到很多,因为CMake对于Android来说是新的。

  

如果我应该为特定平台构建所有lib,那么如何更好地做,无论是作为静态库(.a + headers)还是作为共享库?

这主要取决于您为应用构建的共享库的数量。应用程序的理想模型是在您的应用程序中使用单个共享库,并在所有依赖项中静态链接(以避免旧版Android上的链接器错误,并使您的应用程序尽可能小)。如果您的代码有多个共享库,那么您需要为依赖项使用共享库以避免ODR问题。

  

我是否真的需要为所有平台构建NTL和Boost,或者我应该只针对所需的库进行构建?

您需要在任何需要使用这些库的平台上执行此操作。

  

是否需要Android.mk文件或可以帮助cmake?据我所知,它与" ndk-build"一起使用。仅

CMake和ndk-build都应该有效,但由于CMake在Android中相对年轻,你可能更容易找到ndk-build的移植说明。