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


83

ベクターのようなC ++クラスをAndroidNDKプロジェクトに(最新のNDK r5bを使用して)含めようとすると、次のようなエラーが発生します...

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がリリースされてから)。誰かアドバイスがあれば本当にありがたいです。ありがとう!


2
まず、android-ndk-r5 \ build \ platform \ android- X\ arch-arm \ usr \ includeディレクトリを確認します-vector本当にありますか?
Seva Alekseyev 2011

2
いいえそうではありません!JNIを使​​用してソースをコンパイルする以外に、NDKがどのように機能するかについてはよくわかりません。どうすればベクターをそこに配置できますか?それが何かを意味するのであれば、android-ndk-r5b / sources / cxx-stl / stlport / stlportにベクターが表示されます。迅速な返信をありがとう、そして本当に感謝しています!
nitrex88 2011

2
@sevaそこで、ツールチェーンとビルド済みツール(NDKのツールフォルダー内の.shファイル)を再構築するための一連のツールを実行しようとしましたが、それでもSTLヘッダーを機能させることができませんでした。アンドロイドサイトからNDKを新しくダウンロードした場合、すべてがうまくいくはずではありませんか?試しましたが、新規ダウンロードしても何も変わりません。あなたが提供できる問題についてこれ以上の洞察はありますか?
nitrex88 2011

[これが、AndroidFroyoで動作するようにSTLPortを構成した方法です。] [1] [1]:stackoverflow.com/questions/1650963/ustl-or-stlport-for-android
ZhangXuelian 2011年

[これが、AndroidFroyoで動作するようにSTLPortを構成した方法です。] [1] [1]:stackoverflow.com/questions/1650963/ustl-or-stlport-for-android
ZhangXuelian 2011年

回答:


121

可能です。ここにいくつかのステップバイステップがあります:

では$ 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 /ハロー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


5
ありがとうありがとう!!あなたはついに私の問題を解決しました。Application.mkが間違った場所にあることがわかりました!私はそれをプロジェクトフォルダーに持っていましたが、JNIフォルダーにはありませんでした(理由はわかりませんが、Android開発を始めてから、いつもそこにあると思っていました)。Application.mkのパスをjniフォルダーに配置しているのを見て、私は気づきました。ありがとう、あなたは賞金を手に入れます!
nitrex88 2011

2
必要なApplication.mkを作成するだけで解決しましたが、メッセージが表示されますAndroid NDK: You might want to use $NDK/build/tools/build-stlport.sh。注:これはcygwinでは機能しませんでした
誰かが

こんにちは、vectorを使用したアプリケーションを作成できます。
CoDe 2012

こんにちは、Application.mkファイルにAPP_STL:= stlport_staticを追加しました。これは私のアプリケーションでは機能しますが、Androidソースに含まれているのと同じアプリケーションです。ここでは、コードのコンパイル中に「ベクタークラスが見つかりません。」というエラーが表示されます。plsは私に誰もがそれについての考えを持っていることを示唆しています。
CoDe 2012

1
プロジェクトのサンプルをgithubにアップロードしてURLを共有できるとしたら、それを見てみましょう。
セバスチャンロス

20

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

1
なぜstlport_sharedありませんかstlport_static
IgorGanapolsky 2016年

9

私はAndroidStudioを使用していますが、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
    }

    ...

}

ffmpegでこの問題が発生しています。実際には、ndkビルドは正常に機能しており、.soファイルは正常に生成されますが、ヘッダーファイルがありません。それについて何か考えがありますか?(私は
gradle

それはgradle-experimentalプラグインですか?
セバスチャンロス

なぜgnustl_shared代わりにgnustl_static
IgorGanapolsky 2016

うまくいきました、私はこれが答えとして選ばれるべきだと思います。
Vishnudev K 2016

最新のAndroidStudio 2.1.3でこれを試しましたが、機能しないようです。それをテストするために、HelloJNIサンプルアプリケーションを取得し、hello-jni.cの名前を.cppに変更し、それに#include <vector>を追加しました。エラーが発生します: fatal error: 'vector' file not found #include <vector>モジュールのgradleファイルにstl = "gnustl_static"または "gnustl_shared"を追加した後、追加の手順が必要ですか?
SideLobe 2016

4

セバスチャンが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

そして、私はここから「 'stlport_shared'が優先される」という良い共有を見ました。したがって、静的ではなく共有ライブラリとしてstlportを使用する方が良い解決策かもしれません。次の行をAndroid.mkに追加するだけで、Application.mkファイルを追加する必要はありません。

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

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


明確にするために、「同じjniフォルダー」と言うときは、Androidプロジェクトのjniフォルダーを指しますか?知っておくべき場所が他にないことを確認したい。補足:その良い共有リンクは現在死んでいます:(
Hunter-Orionnoir 2015

4

セバスチャン・ロスの答えに少し付け加えさせてください

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

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

C / C ++プロジェクトを変換する方法

この問題を修正するには、プロジェクトを右クリックし、[プロパティ]をクリックします

[ C / C ++一般] -> [パスとシンボル]を選択し、[含める]ディレクトリ${ANDROID_NDK}/sources/cxx-stl/stlport/stlport含めます

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

ダイアログ

前

後

アップデート#1

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


3

ndk r10c以降を使用している場合は、APP_STL = c ++ _staticをApplication.mkに追加するだけです。


1

これが私の場合の問題の原因です(CMakeLists.txt):

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

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


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.