我正在尝试使用最新的Gradle构建和运行现有的Android NDK项目。但是我在运行应用程序时遇到错误。
Build command failed.
Error while executing process D:\rapiscan\Android\Sdk\cmake\3.6.4111459\bin\cmake.exe with arguments {--build D:\rapiscan\codebase\NGC\NextGenConsole\app\.externalNativeBuild\cmake\debug\x86 --target UiDataProvider}
[1/4] Building CXX object UiDataProvider/CMakeFiles/UiDataProvider.dir/UiCmdHandler.cpp.o
[2/4] Building CXX object UiDataProvider/CMakeFiles/UiDataProvider.dir/UiDataProvider.cpp.o
[3/4] Building CXX object UiDataProvider/CMakeFiles/UiDataProvider.dir/UiMessageGenerator.cpp.o
FAILED: D:\rapiscan\Android\Sdk\ndk-bundle\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++.exe --target=i686-none-linux-android23 --gcc-toolchain=D:/rapiscan/Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt/windows-x86_64 -DUiDataProvider_EXPORTS -IUiDataProvider -ID:/rapiscan/codebase/NGC/NextGenConsole/malibu/UiDataProvider -ID:/rapiscan/Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/include/arm-linux-androideabi -ID:/rapiscan/codebase/NGC/NextGenConsole/malibu/Common -pthread -O0 -fno-limit-debug-info -fPIC -std=gnu++14 -MD -MT UiDataProvider/CMakeFiles/UiDataProvider.dir/UiDataProvider.cpp.o -MF UiDataProvider\CMakeFiles\UiDataProvider.dir\UiDataProvider.cpp.o.d -o UiDataProvider/CMakeFiles/UiDataProvider.dir/UiDataProvider.cpp.o -c D:\rapiscan\codebase\NGC\NextGenConsole\malibu\UiDataProvider\UiDataProvider.cpp
In file included from D:\rapiscan\codebase\NGC\NextGenConsole\malibu\UiDataProvider\UiDataProvider.cpp:1:
D:/rapiscan/codebase/NGC/NextGenConsole/malibu/UiDataProvider/UiDataProvider.h:5:10: fatal error: 'string' file not found
`#include <string>`
1 error generated.
以下是在应用build.gradle
中指定的ndk配置
ndk {
ndk {
abiFilters 'armeabi-v7a', 'arm64-v8a','x86'
}
externalNativeBuild {
cmake {
arguments '-DCMAKE_BUILD_TYPE=Debug',"-DPROJECT_DIR:STRING=${mb_sdk_path}",'-DANDROID_PLATFORM=android-23', '-DANDROID_TOOLCHAIN=clang', '-DANDROID_ARM_NEON=TRUE', "-DPATH_TO_MALIBU:STRING=${mb_sdk_path}" ,"-DANDROID_STL=c++_static",
"-DTARGET_PLATFORM=Windows","-DUNIX=FALSE"
cppFlags "-std=c++14 -stdlib=libc++ -frtti -fexceptions"
}
}
}
和下面是build.gradle
buildscript {
repositories {
jcenter()
google()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.3.1'
classpath 'com.novoda:bintray-release:0.9'
}
}
答案 0 :(得分:0)
在每个NDK版本上,将-stdlib=libc++
与CMake一起使用是多余的,或者是无效的。您想要的是-DANDROID_STL=c++_shared
(对于静态库,则是-DANDROID_STL=c++_static
;对于NDK r18 +上的静态库,则什么也不是,因为这是默认设置)。
传递-stdlib=libc++
可能会导致编译器在较早的NDK版本上查找错误的位置,并且是r19 +上的默认位置。
答案 1 :(得分:0)
我在项目中的上一个版本的gradle和cmake上也遇到了同样的问题,但是我发现只有在 Build Variants 错误的情况下才会发生,例如目标是debug-armeabi-v7a
,您正在release
进行编译,请检查正确的变体目标。
My settings:
NDK 19.1.5304403
CMake 3.10.2
build.gradle:
defaultConfig {
...
multiDexEnabled true
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
...
externalNativeBuild {
cmake {
}
}
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
...
注意::有时候,您也应该删除有效的隐藏目录rm -rf app/.externalNativeBuild