是否可以为Android Studio创建仅限CMake的项目?

时间:2018-05-01 19:50:14

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

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

我想用Android Studio CMake替换ndk-build,以便使用当前标准构建我的本机代码。本机代码很少构建,我也不想加重MyLib.aar'因为它的构建时间要长得多,因为它经常构建。

似乎很少甚至没有描述这种构建过程的文档。官方Android文档中涉及的唯一内容是,应该创建一个支持C ++的新Android Studio(app)项目,然后敲击它的CMakeLists.txt'直到它(作为副产品)产生你想要的东西。

理想情况下,如果我知道如何挂钩Android Studio工具链并获取所需的所有特殊环境变量,那么我的目标就可以通过cmake实现。

这可能吗?如果是这样,怎么样?

1 个答案:

答案 0 :(得分:1)

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

所以就像你想要一个纯粹的原生应用程序那样的东西是

func printInfo(_ value: Any) {
   let type = Swift.type(of: value)
   print("'\(value)' of type '\(type)'")
}

除此之外,您需要的任何其他详细信息都是比NDK更多的CMake问题。另请注意,您可以通过Gradle传递参数

# 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)

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

在这里,您要确保您的应用build.gradle有

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

在您的cmake中,您仍然需要

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

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

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

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