【问题标题】:Is it possible to create a CMake-only project for Android Studio?是否可以为 Android Studio 创建一个仅限 CMake 的项目?
【发布时间】:2018-05-01 19:50:14
【问题描述】:

我有一个“MyLib.aar”项目,它为多个 Android 应用程序创建了我的可重用模块。我的库与“libMyNative.so”中的一些本机 C++ 代码链接,该代码是使用 ndk-build 构建的。

我想用 Android Studio CMake 替换 ndk-build,以便使用当前标准构建我的本机代码。本机代码很少构建,我不想让“MyLib.aar”承担更长的构建时间,因为它构建得非常频繁。

似乎几乎没有文档描述这种构建过程。官方 Android 文档中唯一提到的内容是,应该创建一个支持 C++ 的新 Android Studio(应用程序)项目,然后敲击它的“CMakeLists.txt”文件,直到它(作为副产品)生成你想要的东西。

理想情况下,如果我知道如何挂钩到 Android Studio 工具链并获取它需要的所有特殊环境变量,我的目标可以仅使用 cmake 来实现。

这可能吗?如果有,怎么做?

【问题讨论】:

  • ndk-build 得到 Android Studio 的全面支持,不逊色于 CMake。您无需切换。
  • 如果您的意思是 Android Studio 新项目向导为 Android 应用程序创建样板,而不是库 - 您可以编辑您的库的 build.gradle 脚本,例如这个简单的例子:github.com/googlesamples/android-ndk/blob/master/hello-libs/…。在 Android Studio 中,您确实需要将该项目与原生构建合并

标签: android c++ android-studio cmake android-ndk


【解决方案1】:

是的! CMake 在 Android Studio 中的工作方式与在其他地方相同。所有的“特殊环境变量”都是right here in Android's docs

所以你想要一个纯原生应用程序的一件事就是

# build native_app_glue as a static lib
set(APP_GLUE_DIR ${ANDROID_NDK}/sources/android/native_app_glue)
include_directories(${APP_GLUE_DIR})
add_library( app-glue STATIC ${APP_GLUE_DIR}/android_native_app_glue.c)
...
target_link_libraries(MyLibrary app-glue)

除此之外,您需要的任何其他细节都是 CMake 问题,然后是 NDK。另请注意,您可以通过 Gradle 传递参数

externalNativeBuild {
    cmake {
       abiFilters 'armeabi-v7a', 'arm64-v8a'
       arguments '-DANDROID_TOOLCHAIN=clang', '-DANDROID_STL=gnustl_static'
    }
}

更好的编辑 - 我意识到这个问题的目的是让一个 c++ 库在运行时从 Java/Kotlin 加载。

在这里你要确保你的 app build.gradle 有

externalNativeBuild {
     cmake {
        path "CMakeLists.txt"
    }
}

在你的 cmake 中你仍然想要

add_library( MyNative SHARED
${NATIVE_SRC}/myCode.cpp)
...
target_link_libraries(MyNative otherNativeLibraries)

然后你只需用 Java 加载它(Kotlin 不确定)

System.loadLibrary("MyNative");

从这里开始构建 JNI(再次不确定 Kotlin)调用以插入您的 libMyNative.so 库 LOT more detail about that here

【讨论】:

  • 不确定我是否需要“native_app_glue”,因为我只想从 C++ 构建“libMyNative.so”,它只是一个供 Android 应用程序使用的库——无论它们是原生的、Java 还是 Kotlin。我将它包装在 .aar 中,但不一定需要合并该项目和本机构建。 CMaking 'libMyNative.so' 的程序是什么?
  • 您应该能够在 cmake 中使用 add_library( MyNative ...target_link_libraries(MyNative 正常构建您的库,并在 gradle 中构建它作为外部构建,然后您可以从您的 Java 调用 System.loadLibrary("MyNative");跨度>
猜你喜欢
  • 2012-10-25
  • 1970-01-01
  • 2018-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-13
  • 1970-01-01
相关资源
最近更新 更多