我们使用 Android.mk
& Application.mk
NDK构建系统。由于我们在本地层中有多个项目正在使用的通用模块,因为其他项目已经支持 CMakeLists.txt
,我们也将我们的 Android 项目迁移到 CMake。
我在子目录中有多个静态库,主目录 ( jni/
) 正在生成 SO 文件。我写了CMakeLists.txt
单独在子目录中,并将它们 (add_subdirectory) 包含在 jni/CmakeLists.txt
中文件。
我看到编译正在进行但找不到 .so
中的文件构建/中间体/cmake/发布/obj/armeabi 或 项目/库 文件夹。但我在 Android Studio Gralde 中看到了以下消息
以下摘录:
-soname,liblogger.so -o /home/suman//build/intermediates/cmake/release/obj/armeabi-v7a/liblogger.so Logger/CMakeFiles/logger.dir/src/Logger.cpp.o
完整命令:
[2/2] : && /home/suman/Android/android-ndk/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++ --target=armv7-none-linux-androideabi --gcc-toolchain=/home/suman/Android/android-ndk/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64 --sysroot=/home/suman/Android/android-ndk/sysroot -fPIC -isystem /home/suman/Android/android-ndk/sysroot/usr/include/arm-linux-androideabi -D__ANDROID_API__=21 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -fno-integrated-as -marm -Wa,--noexecstack -Wformat -Werror=format-security -frtti -fexceptions -fvisibility=hidden -fstack-protector-all -Wall -c -fmessage-length=0 -Os -DNDEBUG
-Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libatomic.a --sysroot /home/suman/Android/android-ndk/platforms/android-21/arch-arm -Wl,--build-id -Wl,--warn-shared-textrel -Wl,--fatal-warnings -Wl,--fix-cortex-a8 -Wl,--no-undefined -Wl,-z,noexecstack -Qunused-arguments -Wl,-z,relro -Wl,-z,now -shared -Wl,-soname,liblogger.so -o /home/suman//build/intermediates/cmake/release/obj/armeabi-v7a/liblogger.so Logger/CMakeFiles/logger.dir/src/Logger.cpp.o /home/suman/Android/android-ndk/platforms/android-21/arch-arm/usr/lib/liblog.so -latomic -lm "/home/suman/Android/android-ndk/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a/libsupc++.a" "/home/suman/Android/android-ndk/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a/libgnustl_shared.so" && :
我错过了什么吗?
我的文件夹结构是旧的 Android 构建文件夹结构(Eclipse 文件夹结构) - 平面结构。由于项目非常古老且庞大,因此没有迁移到新的文件夹结构,而是我们指定
sourceSets
在 build.gradle
文件。
最佳答案
1) 解决了问题。我在声明 project() 之前设置了一些 CMake 变量,因此这些设置仅在该文件中生效。它没有传播到included_directories() 和add_dependencies()。
2) 不要在 build.gradle 文件中声明任何 externalCMakeBuild { cppFlags }。它弄乱了构建系统设置的 NDK 标志。
关于android - 使用 CMake 在 Android Studio 中未生成 SO 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49107000/