【问题标题】:Android std and stl supportAndroid std 和 stl 支持
【发布时间】:2011-11-12 10:41:16
【问题描述】:

我正在玩 android ndk。我正在使用带有 cygwin(最新版本)的 Window Vista。我在手机上编译并启动了 hello world jni 示例。这是工作。代码是(是一个.cpp文件):

#include <string.h>
#include <jni.h>

extern "C" {
JNIEXPORT jstring JNICALL     Java_org_android_helloworld_HelloworldActivity_invokeNativeFunction(JNIEnv* env, jobject     javaThis);
};


jstring Java_org_android_helloworld_HelloworldActivity_invokeNativeFunction(JNIEnv*     env, jobject javaThis)
{
    return  env->NewStringUTF("Hello from native code!");
} 

我想添加一些修改,只是为了玩一下:

#include <algorithm>

然后,在上面的函数中,我添加了:

int a;
a=std::min<int>(10, 5);

但是编译器说它找不到文件“算法”并且 min() 不是 std 的一部分。

经过一番搜索,我发现 android ndk 有一个 gnu-libstdc++ 目录,其中包含所需的所有 std 文件。阅读 NDK 文档,我了解到 usint std::* 应该可以在不修改代码的情况下工作(如果包含正确的头文件)。但是cygwin上的gcc似乎找不到需要的文件。

为了能够在 android ndk 应用程序的 .cpp 文件中使用 std 和 stl,需要执行哪些步骤?

【问题讨论】:

标签: android c++ android-ndk std c++-standard-library


【解决方案1】:

来自 NDK r5 的 docs/CPLUSPLUS-SUPPORT.html:

默认情况下,最小 C++ 运行时系统的头文件和库 库 (/system/lib/libstdc++.so) 用于构建 C++ 源代码。

但是,您可以通过设置变量来选择不同的实现 APP_STL 到 Application.mk 中的其他内容,例如:

APP_STL := stlport_static

选择此 NDK 提供的静态 STLport 实现。 值 APP_STL 值如下:

system -> 使用默认的最小 C++ 运行时库。
stlport_static -> 使用作为静态库构建的 STLport。
stlport_shared -> 使用构建为共享库的 STLport。
gnustl_static -> 使用 GNU libstdc++ 作为静态库。

您使用的是哪个 NDK?您是否尝试过编译使用 STL 的示例应用程序之一,例如 test-libstdc++?

【讨论】:

  • 我可以在cygwin下使用gcc成功编译示例应用test-libstdc++。似乎 gcc 可以找到 头文件,但如果我包含 ,它就不能。发生了什么??它们在同一个目录下!
  • 但是,我使用的是 r6 版本。我认为 gcc 使用目录 android-ndk-r6/sources/cxx-stl/system/include 中的文件。在那个目录下有一些 stdc++ 头文件,但是很多都丢失了(向量、算法等)...
  • 当我编译示例时,找不到清单文件(没错,因为示例没有)。其次,他默认 APP_PLATFORM 为 3。所以我在 prj 的根目录中添加了一个名为 default.properties 的文件,目标设置为 8(gcc 读取它并切换到目标 8)。 gcc 说的重要一点是:“添加导入目录:/cygdrive/d/android/android-ndk-r6/sources”,然后“寻找带有标签‘cxx-stl/system’的导入模块”。然后:“探测 (..)/system/Android.mk”。我要显示的最后一行是:“在 (..)/system 中找到”。之后,gcc 尝试编译 .cpp。
  • 好的,我解决了。我将 APP_STL := stlport_static 添加到我的应用程序的 Android.mk 中,而不是添加到名为 Application.mk 的文件中(在 /jni 目录中)。我还有一个问题:如何使用预编译的 stlport lib?我问这个是因为它为每个项目重新编译它(也就是说,如果我使用 stl_port 启动一个新的 prj,我第一次运行 ndk-build 时,它将编译 stl 端口)。
猜你喜欢
  • 1970-01-01
  • 2014-05-11
  • 2013-10-19
  • 1970-01-01
  • 1970-01-01
  • 2012-11-16
  • 1970-01-01
  • 2012-06-11
  • 1970-01-01
相关资源
最近更新 更多