无法在Android NDK中包含像vector这样的C ++标头


83

当我尝试在我的Android NDK项目中使用vector之类的C ++类(使用最新的NDK r5b)时,出现如下错误:

Compile++ thumb : test-libstl <= test-libstl.cpp /Users/nitrex88/Desktop/Programming/EclipseProjects/STLTest/jni/test-libstl.cpp:3:18: error: vector: No such file or directory

其他在线上报告此问题的人通过添加

APP_STL := stlport_static

到他们的Application.mk文件。我已经做到了这一点,并尝试了APP_STL的所有其他可能值。我已经清理了项目,运行了ndk-build clean,删除了obj和libs文件夹,但是当我编译时仍然找不到向量类。自从NDK r5推出以来,我已经为此工作了几个星期,如果有人提出任何建议,我将非常感激。谢谢!


2
首先,检查android-ndk-r5 \ build \ platforms \ android- X\ arch-arm \ usr \ include目录-vector真的在吗?
Seva Alekseyev

2
不它不是!除了使用JNI和编译源代码之外,我对NDK的工作方式了解不多。如何获得矢量?我的意思是在android-ndk-r5b / sources / cxx-stl / stlport / stlport中看到了vector。感谢您的快速回复,非常感谢!
Nitrex88'2011-2-4

2
@seva因此,我尝试运行一堆用于重建工具链和预构建的工具(NDK的tools文件夹中的.sh文件),但仍然无法使STL标头正常工作。如果我从android网站上下载了NDK,那么一切都应该正常吗?我尝试过,全新下载没有任何改变。您是否可以提供有关此问题的更多见解?
Nitrex88 2011年

[这是我配置STLPort以使其与Android Froyo一起使用的方式。] [1] [1]:stackoverflow.com/questions/1650963/ustl-or-stlport-for-android
ZhangXuelian 2011年

[这是我将STLPort配置为与Android Froyo一起使用的方式。] [1] [1]:stackoverflow.com/questions/1650963/ustl-or-stlport-for-android
ZhangXuelian 2011年

Answers:


121

有可能的。这是逐步的:

$ PROJECT_DIR / jni / Application.mk中

APP_STL                 := stlport_static

我尝试使用stlport_shared,但没有运气。与libstdc ++相同。

$ PROJECT_DIR / jni / Android.mk中

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := hello-jni
LOCAL_SRC_FILES := hello-jni.cpp
LOCAL_LDLIBS    := -llog

include $(BUILD_SHARED_LIBRARY)

这里没有什么特别的,但是请确保您的文件是.cpp

$ PROJECT_DIR / jni / hello-jni.cpp中

#include <string.h>
#include <jni.h>
#include <android/log.h>

#include <iostream>
#include <vector>


#define  LOG_TAG    "hellojni"
#define  LOGI(...)  __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
#define  LOGE(...)  __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)


#ifdef __cplusplus
extern "C" {
#endif

// Comments omitted.    
void
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
                                                  jobject thiz )
{
    std::vector<std::string> vec;

    // Go ahead and do some stuff with this vector of strings now.
}

#ifdef __cplusplus
}
#endif

在这里唯一咬我的是#ifdef __cplusplus。

观察目录。

要进行编译,请使用ndk-build clean && ndk-build


5
谢谢谢谢!!您终于解决了我的问题。原来我的Application.mk放在错误的位置!我在项目文件夹中有它,但不在JNI文件夹中(我不确定为什么,但是自从我开始android开发以来,我一直以为它就在那儿了)。看到您将Application.mk的路径放在jni文件夹中后,我意识到了。谢谢,您会得到赏金!
Nitrex88'2

2
只需创建必要的Application.mk即可解决该问题,但我看到了消息Android NDK: You might want to use $NDK/build/tools/build-stlport.sh。注意:这在cygwin下不起作用
某处某人2012年

您好,我能够构建使用vector的应用程序。
CoDe

你好,我在Application.mk文件中添加了APP_STL:= stlport_static,它适用于我的应用程序,但是我包含在Android Source中的同一应用程序,在编译代码时,这给了我错误“找不到矢量类..”。请建议我任何人对此都有想法。
CoDe

1
也许您可以将项目样本上传到github并共享URL,然后我们来看一下。
塞巴斯蒂安·罗斯

20

如果您使用的是Android Studio,并且在使用ndk进行编译时仍然看到消息“错误:向量:没有这样的文件或目录”(或其他与stl相关的错误),那么这可能会对您有所帮助。

在您的项目中,打开模块的build.gradle文件(不是项目的build.grade,而是用于模块的文件),然后在defaultConfig的ndk元素中添加“ stl“ stlport_shared”“。

例如:

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"

    defaultConfig {
        applicationId "com.domain.app"
        minSdkVersion 15
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"

        ndk {
            moduleName "myModuleName"
            stl "stlport_shared"
        }
    }
}

1
为什么stlport_sharedstlport_static呢?
IgorGanapolsky '16

9

我使用的是Android Studio,截至2016年1月19日,这对我有用。(这似乎每年都会改变)

转到:应用程序-> Gradle脚本-> build.gradle(模块:应用程序)

然后在模型{... android.ndk {...下添加一行:stl =“ gnustl_shared”

像这样:

model {

    ...

    android.ndk {
        moduleName = "gl2jni"
        cppFlags.add("-Werror")
        ldLibs.addAll(["log", "GLESv2"])
        stl = "gnustl_shared"     //  <-- this is the line that I added
    }

    ...

}

嘿,我遇到了ffmpeg的问题,实际上ndk build可以正常工作,并且可以成功生成.so文件,但是缺少头文件,您对此有任何想法吗?(我将Android Studio与Gradle实验性插件一起使用)
Pushpendra '16

那是gradle-experimental插件吗?
塞巴斯蒂安·罗斯

为什么要gnustl_shared代替gnustl_static
IgorGanapolsky '16

的作品,我想这应该被选为答案。
Vishnudev K

我在最新的Android Studio 2.1.3上进行了尝试,但似乎无法正常工作。为了测试它,我使用了HelloJNI示例应用程序,将hello-jni.c重命名为.cpp,并在其中添加了#include <vector>。我收到错误消息: fatal error: 'vector' file not found #include <vector>将stl =“ gnustl_static”或“ gnustl_shared”添加到模块的gradle文件后,是否还需要执行任何其他步骤?
SideLobe

4

即使塞巴斯蒂安在3年前在这里给出了很好的答案,我仍然想在这里分享新的经验,以防您在新的ndk版本中遇到与我相同的问题。

我有编译错误,例如:

fatal error: map: No such file or directory
fatal error: vector: No such file or directory

我的环境是android-ndk-r9d和adt-bundle-linux-x86_64-20140702。我在同一jni文件夹中添加Application.mk文件,并插入一行(仅一行):

APP_STL := stlport_static

但是不幸的是,它不能解决我的问题!我必须将以下3行添加到Android.mk中来解决它:

ifndef NDK_ROOT
include external/stlport/libstlport.mk
endif

我从这里看到一个很好的共享,上面写着“首选'stlport_shared'”。因此,将stlport用作共享库而不是静态库可能是一个更好的解决方案。只需将以下行添加到Android.mk中,然后无需添加文件Application.mk。

ifndef NDK_ROOT
include external/stlport/libstlport.mk
endif
LOCAL_SHARED_LIBRARIES += libstlport

希望这会有所帮助。


为了清楚起见,当您说“相同的jni文件夹”时,是指android项目的jni文件夹?我想确保没有其他地方我应该知道。旁注:良好的分享链接现在已经
不可用了

4

让我对塞巴斯蒂安·罗斯的回答再说一点

ndk-build添加Sebastian发布的代码后,可以在命令行中使用编译您的项目。但是对我而言,Eclipse中存在语法错误,并且我没有代码完成。

请注意,您的项目必须转换为C / C ++项目。

如何转换C / C ++项目

要解决此问题,请右键单击您的项目,然后单击“属性”。

选择C / C ++通用- >路径和符号,并包括${ANDROID_NDK}/sources/cxx-stl/stlport/stlport包含目录

出现对话框时,单击“是”

对话

之前

之前

后

更新#1

GNUC。添加目录,重建。C源文件
GNU C ++中不会有任何错误添加目录,重建。CPP源文件中不会有任何错误。


3

如果您使用的是ndk r10c或更高版本,只需将APP_STL = c ++ _ static添加到Application.mk


1

这是导致我的问题(CMakeLists.txt)的原因:

set (CMAKE_CXX_FLAGS "...some flags...")

它使所有先前定义的包含目录不可见。删除/重构此行后,一切正常。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.