web-dev-qa-db-ja.com

Android NDKにベクターのようなC ++ヘッダーを含めることはできません

Android NDKプロジェクト(最新のNDK r5bを使用)にvectorなどのC++クラスを含めようとすると、次のようなエラーが表示されます...

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がリリースされて以来、私はこれに数週間取り組んでおり、誰かからアドバイスがあれば本当に感謝しています。ありがとう!

82
Nitrex88

可能です。手順を追って説明します。

$ 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を使用します。

120
Sebastian Roth

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"
        }
    }
}
20
rlcoder

私はAndroid St​​udioを使用していますが、2016年1月19日の時点でこれがうまくいきました。 (これは毎年変わるもののようです)

移動:app-> Gradle Scripts-> build.gradle(モジュール:app)

次に、モデル{... 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
    }

    ...

}
9
kynnysmatto

セバスチャン・ロスの答え。

Sebastianが投稿したコードを追加した後、コマンドラインでndk-buildを使用してプロジェクトをコンパイルできます。しかし、私に関しては、Eclipseに構文エラーがあり、コード補完がありませんでした。

プロジェクトをC/C++プロジェクトに変換する必要があることに注意してください。

C/C++プロジェクトの変換方法

この問題を修正するには、プロジェクトを右クリックして、Propertiesをクリックします

C/C++ General->Paths and Symbolsを選択し、${Android_NDK}/sources/cxx-stl/stlport/stlportに含めますディレクトリを含める

ダイアログが表示されたら、はいをクリックします。

Dialog

Before

Before

After

After

#1を更新

GNU C。ディレクトリを追加し、再構築します。 Cソースファイルにエラーはありません。
GNU C++。ディレクトリを追加し、再構築します。 CPPソースファイルにエラーはありません。

4
Maksim Dmitriev

セバスチャンも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ファイルを追加し、1行(1行のみ)を挿入します。

APP_STL := stlport_static

しかし、残念ながら、それは私の問題を解決しません!解決するには、Android.mkに次の3行を追加する必要があります。

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

これが役に立てば幸いです。

4
gary

Ndk r10c以降を使用している場合は、APP.STL = c ++ _ staticをApplication.mkに追加するだけです

3
clark.li

これが私の場合に問題を引き起こしたものです(CMakeLists.txt):

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

以前に定義されたすべてのインクルードディレクトリを非表示にします。この行を削除/リファクタリングした後、すべてが正常に機能します。

1
Fedorov7890

Android NDKで、AndroidマシンのAndroid-ndk-r9b>/sources/cxx-stl/gnu-libstdc ++/4.X/includeに移動します。

私は以下のリンクから解決策を見つけました http://osdir.com/ml/Android-ndk/2011-09/msg00336.html

0
Rojesh