我有一个' 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实现。
这可能吗?如果是这样,怎么样?
答案 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