首页 > 解决方案 > Android Studio 构建 ndk 项目找不到“字符串”文件

问题描述

我的 ndk 演示已经正确运行。但是当我包含其他文件时,会抛出构建错误。

构建.gradle:

ndk {
        moduleName "addcomputer"
        abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86','x86_64' // <- only the supported ones
    }
    task ndkBuild(type:Exec,description:'Compile JNI source via NDK'){
        commandLine "/Users/eilir/Downloads/android-ndk-r16-beta1/ndk-build",
                'NDK_PROJECT_PATH=build/intermediates/ndk',
                'NDK_LIBS_OUT=src/main/jniLibs',
                'APP_BUILD_SCRIPT=src/main/jni/Android.mk',
                'NDK_APPLOCATION_MK=src/main/jni/Application.mk',
                "V=1",
                "APP_STL=stlport_shared",
                "APP_CPPFLAGS = -fexceptions"
    }......

cpp代码:

#include <string>
#include <jni.h>
#include <cstdlib>
#include <unistd.h>
//#include <sys/types.h>
//#include <elf.h>
//#include <sys/mman.h>
//#include <Android/log.h>

#ifdef __cplusplus
extern "C" {
#endif
JNIEXPORT jstring JNICALL
Java_com_BTC_ui_JNI_getString(JNIEnv *env, jobject instance)
{
    string a = "ggg";
    return env->NewStringUTF(a.c_str());
}

JNIEXPORT jint JNICALL
Java_com_BTC_ui_JNI_plus(JNIEnv *env, jobject instance, jint a, jint b)
{
    return a+b;
}

#ifdef __cplusplus
}
#endif

Android.mk 内容:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := addcomputer
LOCAL_SRC_FILES := addcomputer.cpp
LOCAL_LDLIBS := -llog
include $(BUILD_SHARED_LIBRARY)

Application.mk 内容:

APP_ABI:=armeabi-v7a, arm64-v8a, x86, x86_64
#指定C++运行库为微型系统C++运行库
#APP_STL:=stlport_shared
APP_STL:=gnustl_shared
#APP_STL:=gnustl_static
#APP_STL:=system
#要为整个应用启用异常处理支持
APP_CPPFLAGS += -fexceptions

我的 gradle 构建命令行:

    /path/to/myndk/android-ndk-r16-beta1/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ -MMD -MP -MF build/intermediates/ndk/obj/local/arm64-v8a/objs/addcomputer/addcomputer.o.d -gcc-toolchain /path/to/myndk/android-ndk-r16-beta1/toolchains/aarch64-linux-android-4.9/prebuilt/darwin-x86_64 -target aarch64-none-linux-android -ffunction-sections -funwind-tables -fstack-protector-strong -fpic -Wno-invalid-command-line-argument -Wno-unused-command-line-argument -no-canonical-prefixes  -g -fno-exceptions -fno-rtti -O2 -DNDEBUG  -I/path/to/myndk/android-ndk-r16-beta1/sources/cxx-stl/stlport/stlport -I/path/to/myndk/android-ndk-r16-beta1/sources/cxx-stl//gabi++/include -Isrc/main/jni   -fexceptions  -DANDROID  -D__ANDROID_API__=21 -Wa,--noexecstack -Wformat -Werror=format-security  -frtti  --sysroot /path/to/myndk/android-ndk-r16-beta1/sysroot -isystem /path/to/myndk/android-ndk-r16-beta1/sysroot/usr/include/aarch64-linux-android -c  src/main/jni/addcomputer.cpp -o build/intermediates/ndk/obj/local/arm64-v8a/objs/addcomputer/addcomputer.o

我发现我的 Application.mk 可以在 build.gradle 中被覆盖,但即使我配置 APP_STL=stlport_shared ,我也可以在路径“/path/to/myndk/android-ndk-r16-beta1/sources”中找到“字符串”文件/cxx-stl/stlport/stlport”,我不明白为什么编译器找不到“字符串”文件。任何人都可以帮助我吗?

superaddition: 刚发现gradle的任务是多种多样的,如下:

:app:compileDebugRenderscript
:app:generateDebugBuildConfig
:app:generateDebugResValues
:app:generateDebugResources
:app:mergeDebugResources
:app:processDebugManifest
:app:processDebugResources
:app:generateDebugSources
:app:preDebugAndroidTestBuild UP-TO-DATE
:app:prepareDebugAndroidTestDependencies
:app:compileDebugAndroidTestAidl
:app:processDebugAndroidTestManifest
:app:compileDebugAndroidTestRenderscript
:app:generateDebugAndroidTestBuildConfig
:app:generateDebugAndroidTestResValues
:app:generateDebugAndroidTestResources
:app:mergeDebugAndroidTestResources
:app:processDebugAndroidTestResources
:app:generateDebugAndroidTestSources
:app:incrementalDebugJavaCompilationSafeguard
:app:javaPreCompileDebug
:app:ndkBuild

查看上面的最后一行,:app:ndkBuild,该任务运行良好,错误发生在另一个任务,如下所示:

        :app:compileDebugNdk
Warning: Deprecated NDK integration enabled by useDeprecatedNdk flag in gradle.properties will be removed from Android Gradle plugin soon.
Consider using CMake or ndk-build integration with the stable Android Gradle plugin:
 https://developer.android.com/studio/projects/add-native-code.html
or use the experimental plugin:
 https://developer.android.com/studio/build/experimental-plugin.html.

Android NDK: WARNING: Unsupported source file extensions in /path/to/project/app/build/intermediates/ndk/debug/Android.mk for module addcomputer    
Android NDK:   /path/to/project/app/src/main/jni/Android.mk /path/to/project/app/src/main/jni/Application.mk    
Android NDK: WARNING: Unsupported source file extensions in /path/to/project/app/build/intermediates/ndk/debug/Android.mk for module addcomputer    
Android NDK:   /path/to/project/app/src/main/jni/Android.mk /path/to/project/app/src/main/jni/Application.mk    
Android NDK: WARNING: Unsupported source file extensions in /path/to/project/app/build/intermediates/ndk/debug/Android.mk for module addcomputer    
Android NDK:   /path/to/project/app/src/main/jni/Android.mk /path/to/project/app/src/main/jni/Application.mk    
Android NDK: WARNING: Unsupported source file extensions in /path/to/project/app/build/intermediates/ndk/debug/Android.mk for module addcomputer    
Android NDK:   /path/to/project/app/src/main/jni/Android.mk /path/to/project/app/src/main/jni/Application.mk    
[armeabi-v7a] Compile++ thumb: addcomputer <= addcomputer.cpp
[armeabi-v7a] Compile++ thumb: addcomputer <= Socket.cpp


/path/to/project/app/src/main/jni/Socket.cpp:9:10: fatal error: 'iostream.h' file not found
#include <iostream.h>
         ^~~~~~~~~~~~
1 error generated.


:app:compileDebugNdk FAILED 

任务compileDebugNdk而不是 ndkBuild引发的错误 。

标签: android-ndk

解决方案


我已将 IDE 更新为 Android studio 3.1.2 和 gradle 版本 4.4,并将 ndk-guild 更改为 CMake,将 Android.mk 和 Application.mk 更改为 CMakeLists.txt,经过数小时的工作,我终于得到了正确的状态。错误找不到“字符串”文件。现在一切正常。谢谢大家!


推荐阅读