android - 是否可以为 Android Studio 创建仅使用 CMake 的项目?

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

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

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

似乎很少甚至没有描述这种构建过程的文档。官方 Android 文档中涵盖的唯一一件事是,应该创建一个支持 C++ 的新 Android Studio(应用程序)项目,然后打开其“CMakeLists.txt”文件,直到它(作为副产品)生成您想要的内容。

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

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

最佳答案

是的! 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'
    }
}

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

在这里,您要确保您的应用程序 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

关于android - 是否可以为 Android Studio 创建仅使用 CMake 的项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50122885/

相关文章:

java - 应用程序在添加第二个navHostFragment时崩溃

android - startActivity 如何决定是启动一个停止的 Activity 还是创建一个新 Activity?

c++ - 将 int 数组放入 char 中。 C 或 C++

android-studio - 在 Android 模拟器中禁用鼠标滚轮集成

从 Android Studio 0.54 更新到 0.81 "NoSuchMethodError"后,Gradle 不会同步

java - 删除 map View 中除选定区域之外的所有其他区域

android - WebView : how to avoid security alert from Google Play upon implementation of onReceivedSslError

c++ - 带有 std::map<T*, U> 的程序是否具有明确定义的行为?

c++ - Visual Studio 2010 : Linker > Command Line contains unneeded . 库

android - ' :ProjectName' could not be found