使用 NDK 构建具有 cmake 构建文件的 c++ 项目



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

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

  2. 最后,当我有 2 个库时,如何集成到 Android Studio?我从这个链接中学会了如何为预构建的库创建 Android.mks在 Android Studio 中使用预建的共享库但是我的 lib2 依赖于 lib1 进行编译和运行。Jni 代码将取决于 lib2 和 lib1 的组合库

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

最有可能的是,适用于其他平台的CMake脚本将需要对Android进行一些更改。此外,我们经常需要对外部依赖进行特殊处理,例如,如果我们希望 CMake 找到正确的 boost 版本。

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 包装器的主CMakeList 中.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

最新更新