10

私はアンドロイド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 には、必要なすべての std ファイルを含む gnu-libstdc++ ディレクトリがあることがわかりました。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) のヘッダーとライブラリが使用されます。

ただし、Application.mk で変数 APP_STL を別の値に設定することで、別の実装を選択できます。たとえば、次のようになります。

APP_STL := stlport_static

この NDK で提供される静的 STLport 実装を選択するには。値 APP_STL の値は次のとおりです。

system -> デフォルトの最小限の C++ ランタイム ライブラリを使用します。
stlport_static -> スタティック ライブラリとしてビルドされた STLport を使用します。
stlport_shared -> 共有ライブラリとしてビルドされた STLport を使用します。
gnustl_static -> GNU libstdc++ をスタティック ライブラリとして使用します。

どの NDK を使用していますか? test-libstdc++ などの STL を利用するサンプル アプリケーションの 1 つをコンパイルしてみましたか?

于 2011-09-07T23:40:43.683 に答える