【问题标题】:Building c++ projects which have cmake build files for Android using NDK使用 NDK 构建具有适用于 Android 的 cmake 构建文件的 c++ 项目
【发布时间】:2018-09-17 14:05:29
【问题描述】:

我必须构建 2 个独立的 C++ 项目,这些项目具有为不同平台设置的 Cmake 构建文件。我想使用 NDK 为 Android 构建它们,以便我可以将它们用作 Android Studio 中的预构建库。

  1. 如何使用 NDK 为 Android 构建它们以生成适用于 Arm 架构的 .a/.so?我可以使用 cmake 本身来做吗?请提供详细步骤

  2. 最后,当我有 2 个库时,如何集成到 Android Studio? 我从这个链接学习了如何为预建库创建 Android.mks Using Pre-built Shared Library in Android Studio 但是我的 lib2 依赖于 lib1 进行编译和运行。 Jni 代码将依赖于 lib2 和 lib1 的组合库

我是 NDK 的新手。所以请提供详细的答案

【问题讨论】:

  • 但这描述了如何将 c++ 源代码添加到 android studio 并使用 cmake 编译它,对吗?我的 C++ 项目本身就是一个相当大的系统。所以我想使用命令行为Android单独编译它,然后将该库添加到Android Studio。

标签: android cmake android-ndk android.mk


【解决方案1】:

很可能,适用于其他平台的 CMake 脚本需要对 Android 进行一些更改。此外,我们经常需要对外部依赖项进行特殊处理,例如如果我们希望 CMake 找到 boostthe correct version

但是CMakeLists.txt的主骨架应该是一个好的开始。您可以为您的库“手动”运行 CMake:

cmake                                                           \
    -DCMAKE_TOOLCHAIN_FILE=${NDK_ROOT}/build/cmake/android.toolchain.cmake \
    -DANDROID_NDK=${NDK_ROOT}                               \
    -DANDROID_ABI=armeabi-v7a                               \
    -DANDROID_PLATFORM=android-19                           \
    -DANDROID_STL=c++_shared                                \
    -DCMAKE_LIBRARY_OUTPUT_DIRECTORY=${LIB1_DIRECTORY}/libs/armeabi-v7a       \
    ${LIB1_DIRECTORY}

在构建 JNI 包装器的 main CMakeLists.txt 中,您可以添加

add_library(lib1 SHARED IMPORTED)
set_target_properties(lib1 PROPERTIES IMPORTED_LOCATION ${LIB1_DIRECTORY}/libs/armeabi-v7a/lib1.so )
target_link_libraries(jni_wrapper lib1 … log)

Android Studio 不会为您构建 lib1.so,但它会从正确的位置选择它并将其打包到 APK 中。

如果 CMake 脚本尚未处理此依赖项,则与 IMPORTED 相同的技巧将为构建 lib2 提供 lib1

【讨论】:

  • 谢谢@Alex。使用现有的 cmake 我收到此错误 CMAKE_SYSTEM_NAME is 'Android' 但未安装 'NVIDIA Nsight Tegra Visual Studio Edition'。你知道为什么会这样吗?
  • 可能您的 PC 上安装了来自 NVIDIA 的这个软件包,并且它的 cmake 在系统路径上。尝试提供作为 Android SDK 一部分的 cmake 可执行文件的完整路径。
  • 我已经构建了一个库,并将其添加到 Android Studio 项目并设置了一个 Android.mk。现在的问题是我包含在我的 jni 文件中的库中的包含文件正在寻找 Boost 头文件。有没有办法在 Android.mk 中指定 Boost 根路径(C:Boost)?如何告诉 Android Studio 在哪里寻找 Boost 标头?
  • Android.mk 对 boost 一无所知,不像 cmake。如果必须提供 boost 路径,则必须将其作为参数传递给 ndk-build,或者从 OS 环境字符串中获取它,或者在最坏的情况下,您可以对其进行硬编码。
  • 我也在这样做,我想创建一个共享库,其中包含 libssl.a 和 libcrypto.a 但得到 ld: warning: ld: warning: ignoring file openssl-armeabi-v7a/lib /libcrypto.a,文件是为存档而构建的,它不是被链接的架构 (x86_64):openssl-armeabi-v7a/lib/libcrypto.aignoring 文件 openssl-armeabi-v7a/lib/libssl.a,文件是为存档而构建的这不是被链接的架构(x86_64):openssl-armeabi-v7a/lib/libssl.a 不明白我做错了什么
猜你喜欢
  • 2013-10-13
  • 2019-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-15
  • 2017-11-12
相关资源
最近更新 更多