10

我正在玩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,需要执行哪些步骤?

4

1 回答 1

14

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

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

但是,您可以通过将变量 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++?

于 2011-09-07T23:40:43.683 回答