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

时间:2018-04-07 20:06:59

标签: android cmake android-ndk android.mk

我必须构建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

  3. 的组合库

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

1 个答案:

答案 0 :(得分:0)

最有可能的是,适用于其他平台的CMake脚本需要对Android进行一些更改。此外,我们经常需要对外部依赖性进行特殊处理,例如:如果我们希望CMake找到提升the 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 的相同技巧将提供 lib1 以构建 lib2