C ++ - Header wie Vektor können nicht in Android NDK aufgenommen werden


83

Wenn ich versuche, eine C ++ - Klasse wie einen Vektor in mein Android-NDK-Projekt aufzunehmen (mit NDK r5b, der neuesten Version), wird folgende Fehlermeldung angezeigt:

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

Andere Personen, die dieses Problem online gemeldet haben, haben durch Hinzufügen Erfolg behauptet

APP_STL := stlport_static

zu ihrer Application.mk-Datei. Ich habe dies getan und jeden anderen möglichen Wert für APP_STL ausprobiert. Ich habe bereinigt, um zu projizieren, ndk-build clean ausgeführt, die Ordner obj und libs gelöscht, und beim Kompilieren kann die Vektorklasse immer noch nicht gefunden werden. Ich arbeite jetzt seit einigen Wochen daran (seit NDK r5 herausgekommen ist) und würde mich sehr freuen, wenn jemand einen Rat hat. Vielen Dank!


2
Überprüfen Sie zunächst das Verzeichnis android-ndk-r5 \ build \ platform \ android- X\ arch-arm \ usr \ include - ist das vectorwirklich vorhanden?
Seva Alekseyev

2
Nein ist es nicht! Ich weiß nicht viel darüber, wie das NDK funktioniert, außer JNI zu verwenden und die Quellen zu kompilieren. Wie kann ich Vektor dazu bringen, dort zu sein? Ich sehe Vektor in android-ndk-r5b / sources / cxx-stl / stlport / stlport, wenn das etwas bedeutet. Vielen Dank für die schnelle Antwort und ich schätze es sehr!
Nitrex88

2
@seva Also habe ich versucht, eine Reihe von Tools zum Wiederherstellen der Toolchain und der Prebuilts (die .sh-Dateien im Tools-Ordner des NDK) auszuführen und konnte STL-Header immer noch nicht zum Laufen bringen. Wenn ich das NDK frisch von der Android-Site herunterlade, sollte dann nicht alles funktionieren? Ich habe versucht und ein neuer Download ändert nichts. Noch mehr Einblick in die Angelegenheit, die Sie anbieten könnten?
Nitrex88

[So habe ich STLPort für die Arbeit mit Android Froyo konfiguriert.] [1] [1]: stackoverflow.com/questions/1650963/ustl-or-stlport-for-android
ZhangXuelian

[So habe ich STLPort für die Arbeit mit Android Froyo konfiguriert.] [1] [1]: stackoverflow.com/questions/1650963/ustl-or-stlport-for-android
ZhangXuelian

Antworten:


121

Es ist möglich. Hier ist ein Schritt für Schritt:

In $ PROJECT_DIR / jni / Application.mk :

APP_STL                 := stlport_static

Ich habe versucht, stlport_shared zu verwenden, aber kein Glück. Gleiches gilt für libstdc ++.

In $ 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)

Hier gibt es nichts Besonderes, aber stellen Sie sicher, dass Ihre Dateien .cpp sind .

In $ 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

Das einzige, was mich hier gebissen hat, war #ifdef __cplusplus.

Beobachten Sie die Verzeichnisse.

Verwenden Sie zum Kompilieren ndk-build clean && ndk-build.


5
Danke Danke!! Du hast endlich mein Problem gelöst. Es stellte sich heraus, dass ich meine Application.mk am falschen Ort hatte! Ich hatte es im Projektordner, aber nicht im JNI-Ordner (ich bin mir nicht sicher warum, aber seit ich mit der Android-Entwicklung angefangen habe, dachte ich immer, dass es dort hingeht). Als ich sah, dass Sie den Pfad von Application.mk in den Ordner jni gelegt haben, wurde mir klar. Danke und du bekommst das Kopfgeld!
Nitrex88

2
Einfach die notwendige Application.mk zu erstellen hat es gelöst, aber ich sehe die Nachricht Android NDK: You might want to use $NDK/build/tools/build-stlport.sh. HINWEIS: Dies funktionierte nicht unter Cygwin
Jemand irgendwo

Hallo, ich kann eine Anwendung erstellen, die Vektor verwendet.
CoDe

Hallo, ich habe APP_STL: = stlport_static in der Datei Application.mk hinzugefügt und es funktioniert für meine Anwendung, aber dieselbe Anwendung, die ich in Android Source einbinde. Hier wird mir beim Kompilieren des Codes der Fehler "Vektorklasse nicht gefunden ..." angezeigt. Bitte schlagen Sie mir vor, jemand hat eine Idee davon.
CoDe

1
Vielleicht können Sie ein Beispiel Ihres Projekts auf github hochladen und die URL teilen, dann könnten wir einen Blick darauf werfen.
Sebastian Roth

20

Wenn Sie Android Studio verwenden und beim Kompilieren mit ndk immer noch die Meldung "Fehler: Vektor: Keine solche Datei oder kein solches Verzeichnis" (oder andere stl-bezogene Fehler) angezeigt wird, kann dies hilfreich sein.

Öffnen Sie in Ihrem Projekt die Datei build.gradle des Moduls (nicht die Datei build.grade Ihres Projekts, sondern die für Ihr Modul) und fügen Sie 'stl "stlport_shared"' im ndk-Element in defaultConfig hinzu.

Zum Beispiel:

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
Warum stlport_sharedund nicht stlport_static?
IgorGanapolsky

9

Ich benutze Android Studio und seit dem 19. Januar 2016 hat dies den Trick für mich getan. (Dies scheint sich jedes Jahr zu ändern.)

Gehen Sie zu: app -> Gradle Scripts -> build.gradle (Modul: app)

Dann unter Modell {... android.ndk {... und füge eine Zeile hinzu: stl = "gnustl_shared"

So was:

model {

    ...

    android.ndk {
        moduleName = "gl2jni"
        cppFlags.add("-Werror")
        ldLibs.addAll(["log", "GLESv2"])
        stl = "gnustl_shared"     //  <-- this is the line that I added
    }

    ...

}

Hey, ich bekomme dieses Problem mit ffmpeg, tatsächlich funktioniert ndk build gut und es generiert erfolgreich .so-Dateien, aber Header-Dateien fehlen. Hast du eine Idee dazu? (Ich benutze Android Studio mit Gradle Experimental Plugin)
Pushpendra

Das ist mit dem gradle-experimentellen Plugin?
Sebastian Roth

Warum gnustl_sharedstatt gnustl_static?
IgorGanapolsky

Funktioniert, ich denke, dies sollte als Antwort ausgewählt werden.
Vishnudev K

Ich habe dies mit dem neuesten Android Studio 2.1.3 versucht und es scheint nicht zu funktionieren. Zum Testen habe ich die HelloJNI-Beispielanwendung verwendet, hello-jni.c in .cpp umbenannt und ein #include <vector> hinzugefügt. Ich erhalte die Fehlermeldung: fatal error: 'vector' file not found #include <vector>Sind nach dem Hinzufügen von stl = "gnustl_static" oder "gnustl_shared" zur Gradle-Datei des Moduls zusätzliche Schritte erforderlich?
SideLobe

4

Auch Sebastian hatte dort vor 3 Jahren eine gute Antwort gegeben, ich möchte hier noch eine neue Erfahrung teilen, falls Sie in der neuen ndk-Version auf dasselbe Problem stoßen wie ich.

Ich habe einen Kompilierungsfehler wie:

fatal error: map: No such file or directory
fatal error: vector: No such file or directory

Meine Umgebung ist android-ndk-r9d und adt-bundle-linux-x86_64-20140702. Ich füge die Datei Application.mk im selben jni-Ordner hinzu und füge eine (und nur eine) Zeile ein:

APP_STL := stlport_static

Aber leider löst es mein Problem nicht! Ich muss diese 3 Zeilen in Android.mk hinzufügen, um es zu lösen:

ifndef NDK_ROOT
include external/stlport/libstlport.mk
endif

Und ich habe von hier aus einen guten Austausch gesehen , der besagt, dass "'stlport_shared' bevorzugt wird". Vielleicht ist es eine bessere Lösung, stlport als gemeinsam genutzte Bibliothek anstelle von statisch zu verwenden. Fügen Sie einfach die folgenden Zeilen zu Android.mk hinzu und Sie müssen dann keine Datei Application.mk hinzufügen.

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

Hoffe das ist hilfreich.


Um ganz klar zu sein, wenn Sie "denselben JNI-Ordner" sagen, beziehen Sie sich auf den JNI-Ordner des Android-Projekts? Ich möchte sicherstellen, dass es keinen anderen Ort gibt, den ich kennen sollte. Randnotiz: dieser gute Sharing-Link ist jetzt tot :(
Hunter-Orionnoir

4

Lassen Sie mich ein wenig zu Sebastian Roths Antwort hinzufügen .

Ihr Projekt kann mithilfe ndk-buildder Befehlszeile kompiliert werden, nachdem Sie den Code hinzugefügt haben, den Sebastian gepostet hat. Aber für mich gab es Syntaxfehler in Eclipse, und ich hatte keine Code-Vervollständigung.

Beachten Sie, dass Ihr Projekt in ein C / C ++ - Projekt konvertiert werden muss.

So konvertieren Sie ein C / C ++ - Projekt

Um dieses Problem zu beheben, klicken Sie mit der rechten Maustaste auf Ihr Projekt und klicken Sie auf Eigenschaften

Wählen Sie C / C ++ Allgemein -> Pfade und Symbole und fügen Sie die Verzeichnisse${ANDROID_NDK}/sources/cxx-stl/stlport/stlport zum Einschließen ein

Klicken Sie auf Ja, wenn ein Dialogfeld angezeigt wird.

Dialog

Vor

Vor

Nach dem

Nach dem

Update Nr. 1

GNU C. Verzeichnisse hinzufügen, neu erstellen. In den C- Quelldateien
GNU C ++ treten keine Fehler auf . Verzeichnisse hinzufügen, neu erstellen. In CPP- Quelldateien treten keine Fehler auf .


3

Wenn Sie ndk r10c oder höher verwenden, fügen Sie einfach APP_STL = c ++ _ static zu Application.mk hinzu


1

Dies hat das Problem in meinem Fall verursacht ( CMakeLists.txt):

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

Es macht alle zuvor definierten Include-Verzeichnisse unsichtbar. Nach dem Entfernen / Umgestalten dieser Zeile funktioniert alles einwandfrei.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.