如何解决 Android NDK 构建命令失败的问题?

Nit*_*tel 3 android cmake android-ndk android-studio ndk-build

我正在Android Studio中使用 Android NDK 开发一个简单的 NDK 示例示例。运行我的应用程序工作室时,它显示以下错误。

\n
Build command failed.\nError while executing process D:\\Sdk\\cmake\\3.6.4111459\\bin\\cmake.exe with\narguments {--build D:\\Android Studio\\Workspace\\NDKSample\\app\\.externalNativeBuild\\cmake\\debug\\arm64-v8a --target native-lib}\n[1/2] Building CXX object CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.oFAILED: D:\\Sdk\\ndk-bundle\\toolchains\\llvm\\prebuilt\\windows-x86_64\\bin\\clang++.exe  --target=aarch64-none-linux-android --gcc-toolchain=D:/Sdk/ndk-bundle/toolchains/aarch64-linux-android-4.9/prebuilt/windows-x86_64 --sysroot=D:/Sdk/ndk-bundle/sysroot  -Dnative_lib_EXPORTS -isystem D:/Sdk/ndk-bundle/sources/cxx-stl/gnu-libstdc++/4.9/include -isystem D:/Sdk/ndk-bundle/sources/cxx-stl/gnu-libstdc++/4.9/libs/arm64-v8a/include -isystem D:/Sdk/ndk-bundle/sources/cxx-stl/gnu-libstdc++/4.9/include/backward -isystem D:/Sdk/ndk-bundle/sysroot/usr/include/aarch64-linux-android -D__ANDROID_API__=21 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -Wa,--noexecstack -Wformat -Werror=format-security  -frtti -fexceptions -O0 -fno-limit-debug-info  -fPIC -MD -MT CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o -MF CMakeFiles\\native-lib.dir\\src\\main\\cpp\\native-lib.cpp.o.d -o CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o -c "D:\\Android Studio\\Workspace\\NDKSample\\app\\src\\main\\cpp\\native-lib.cpp"\nerror: error reading \'D:\\Android Studio\\Workspace\\NDKSample\\app\\src\\main\\cpp\\native-lib.cpp\'\n1 error generated.ninja: build stopped: subcommand failed.\n
Run Code Online (Sandbox Code Playgroud)\n

我搜索了很多,但找不到正确的答案。这就是我在这里问的原因。我还卸载了所有组件并在我的工作室实例中重新安装,但错误仍然存​​在。

\n

另一件事:如果我将文件扩展名从 .CPP 更改为 .C,整个项目就会得到编译,甚至可以正常运行。我不知道为什么它\xe2\x80\x99s 不适用于.CPP文件。

\n

我正在使用的组件。

\n

Android Studio - 3.1.3

\n

摇篮- 3.1.0

\n

CMake - 3.6.4111459

\n

Android NDK - 17.1.4828580

\n

LLDB-3.1

\n

文件本机lib.cpp

\n
#include <jni.h>\n#include <string>\n\nextern "C" JNIEXPORT jstringJNICALLJava_com_mastek_ndksample_MainActivity_stringFromJNI(\n    JNIEnv *env,\n    jobject /* this */) {\n\n    std::string hello = "Hello from C++";\n    return env->NewStringUTF(hello.c_str());\n}\n
Run Code Online (Sandbox Code Playgroud)\n

文件构建.gradle

\n
apply plugin: \'com.android.application\'\n\nandroid {\n    compileSdkVersion 27\n    defaultConfig {\n        applicationId "com.example.ndksample"\n        minSdkVersion 15\n        targetSdkVersion 27\n        versionCode 1\n        versionName "1.0"\n        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"\n        externalNativeBuild {\n            cmake {\n                cppFlags "-frtti -fexceptions"\n            }\n        }\n    }\n\n    sourceSets {\n        main {\n            jniLibs.srcDirs = [\'src/main/jniLibs\']\n        }\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile(\'proguard-android.txt\'), \'proguard-rules.pro\'\n        }\n    }\n    externalNativeBuild {\n        cmake {\n            path "CMakeLists.txt"\n        }\n    }\n}\n\ndependencies {\n    implementation fileTree(dir: \'libs\', include: [\'*.jar\'])\n    implementation \'com.android.support:appcompat-v7:27.1.1\'\n    implementation \'com.android.support.constraint:constraint-layout:1.1.2\'\n    testImplementation \'junit:junit:4.12\'\n    androidTestImplementation \'com.android.support.test:runner:1.0.2\'\n    androidTestImplementation \'com.android.support.test.espresso:espresso-core:3.0.2\'\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我该如何解决这个问题?

\n

Ale*_*ohn 5

当项目文件的路径包含空格时,NDK 构建会严重失败。要修复您的构建,请将项目复制到不带空格的路径。