【问题标题】:Can't include C++ headers like vector in Android NDK不能在 Android NDK 中包含像矢量这样的 C++ 标头
【发布时间】:2011-06-21 01:46:03
【问题描述】:

当我尝试在我的 Android NDK 项目(使用最新的 NDK r5b)中包含任何 C++ 类(如 vector)时,我收到如下错误...

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 出现以来),如果有人有任何建议,我将不胜感激。谢谢!

【问题讨论】:

  • 首先,检查 android-ndk-r5\build\platforms\android-X\arch-arm\usr\include 目录 - vector 真的存在吗?
  • 不,不是!除了使用 JNI 和编译源代码之外,我不太了解 NDK 的工作原理。我怎样才能让矢量在那里?如果这意味着什么,我确实在 android-ndk-r5b/sources/cxx-stl/stlport/stlport 中看到了向量。感谢您的快速回复,非常感谢!
  • @seva 所以我尝试运行一堆工具来重建工具链和预构建(NDK 的工具文件夹中的 .sh 文件),但仍然无法使 STL 标头工作。如果我从 android 站点下载新的 NDK,难道不应该一切正常吗?我试过了,新下载并没有改变任何东西。对您可以提供的问题有更多见解吗?
  • [这是我配置 STLPort 以与 Android Froyo 一起使用的方式。][1] [1]:stackoverflow.com/questions/1650963/ustl-or-stlport-for-android
  • [这就是我配置 STLPort 以使用 Android Froyo 的方式。][1] [1]: stackoverflow.com/questions/1650963/ustl-or-stlport-for-android

标签: android stl vector android-ndk


【解决方案1】:

这是可能的。这是一步一步的:

$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 &amp;&amp; ndk-build

【讨论】:

  • 谢谢谢谢!!你终于解决了我的问题。原来我的 Application.mk 放错了地方!我在项目文件夹中有它,但在 JNI 文件夹中没有(我不知道为什么,但自从我开始 android 开发以来,我一直认为它在那里)。看到你把 Application.mk 的路径放在 jni 文件夹中让我意识到。谢谢,你得到了赏金!
  • 只需创建必要的 Application.mk 即可解决,但我看到了消息 Android NDK: You might want to use $NDK/build/tools/build-stlport.sh。注意:这在 cygwin 下不起作用
  • 你好,我能够构建使用矢量的应用程序。
  • 你好,我在 Application.mk 文件中添加了 APP_STL := stlport_static 它适用于我的应用程序,但我在 Android Source 中包含相同的应用程序,这里它给了我错误“找不到矢量类..”编译代码。请建议我任何人对此有想法。
  • 或许您可以将您的项目示例上传到github并分享URL,然后我们可以看看。
【解决方案2】:

在 android NDK 中转到 android-ndk-r9b>/sources/cxx-stl/gnu-libstdc++/4.X/包括在linux机器中

我从以下链接中找到了解决方案 http://osdir.com/ml/android-ndk/2011-09/msg00336.html

【讨论】:

    【解决方案3】:

    让我补充一点Sebastian Roth's answer.

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

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

    How to convert a C/C++ project

    要解决此问题,请右键单击您的项目,单击 属性

    选择 C/C++ 常规 -> 路径和符号 并将${ANDROID_NDK}/sources/cxx-stl/stlport/stlport 包含到包含目录

    当出现对话框时单击

    之前

    之后

    更新 #1

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

    【讨论】:

      【解决方案4】:

      即使Sebastian在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
      

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

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

      希望这有帮助。

      【讨论】:

      • 明确一点,当您说“相同的 jni 文件夹”时,您指的是 android 项目的 jni 文件夹吗?我想确保没有其他我应该注意的位置。旁注:那个好的分享链接现在已经死了:(
      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        如果您使用的是 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"
                }
            }
        }
        

        【讨论】:

        • 为什么是stlport_shared 而不是stlport_static
        【解决方案7】:

        我正在使用 Android Studio,截至 2016 年 1 月 19 日,这对我有用。 (这似乎每年都在变化)

        转到:app -> Gradle Scripts -> build.gradle(模块:app)

        然后在model { ... 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 构建工作正常,并且它成功生成了 .so 文件,但缺少头文件你对此有什么想法吗? (我正在使用带有 gradle 实验插件的 android studio)
        • 使用 gradle-experimental 插件?
        • 为什么是gnustl_shared 而不是gnustl_static
        • 有效,我想应该选择这个作为答案。
        • 我用最新的 Android Studio 2.1.3 试过这个,它似乎不起作用。为了测试它,我使用了 HelloJNI 示例应用程序,将 hello-jni.c 重命名为 .cpp 并添加了一个#include 。我收到错误:fatal error: 'vector' file not found #include &lt;vector&gt; 将 stl="gnustl_static" 或 "gnustl_shared" 添加到模块的 gradle 文件后是否需要执行任何其他步骤?
        【解决方案8】:

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

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

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

        【讨论】:

          【解决方案9】:

          打开 build.grade(模块)并进行一些编辑(删除一个字母并再次添加)。此操作栏自动出现。现在,单击“确定,应用 suugestion”。现在,每个 cpp 和头文件中的问题都已修复。

          .

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-10-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多