Не можна включити заголовки C ++, як вектор, в Android NDK


83

Коли я намагаюся включити будь-який клас C ++, як вектор, у свій проект Android NDK (використовуючи найновіший 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насправді там?
Сева Алексєєв

2
Ні, це не так! Я не знаю багато про те, як NDK працює, окрім використання JNI та компіляції джерел. Як я можу отримати вектор, щоб бути там? Я бачу вектор у android-ndk-r5b / sources / cxx-stl / stlport / stlport, якщо це щось означає. Дякую за швидку відповідь, і я дуже ціную це!
Nitrex88,

2
@seva Тож я спробував запустити купу інструментів для відновлення ланцюжка інструментів та попередньо встановлених (файли .sh у папці інструментів NDK), але все ще не міг запустити заголовки STL. Якщо я завантажую NDK свіжий з сайту android, чи не все може працювати просто? Я спробував, і свіже завантаження нічого не змінює. Більше розуміння справи, яку ви можете запропонувати?
Nitrex88

[Це, як я налаштував STLPort для роботи з Android Froyo.] [1] [1]: stackoverflow.com/questions/1650963/ustl-or-stlport-for-android
ZhangXuelian

[Це, як я налаштував STLPort для роботи з Android Froyo.] [1] [1]: stackoverflow.com/questions/1650963/ustl-or-stlport-for-android
ZhangXuelian

Відповіді:


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 / 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.


5
Дякую дякую!! Ви нарешті вирішили мою проблему. Виявляється, я застосував Application.mk не в тому місці! У мене це було в папці проекту, але не в папці JNI (я не впевнений, чому, але оскільки я почав розробку Android, я завжди думав, що вона туди потрапила). Побачивши, що ви помістили шлях до Application.mk у папці jni, я зрозумів це. Дякую, і ви отримуєте нагороду!
Nitrex88

2
Просто створення необхідного Application.mk це вирішило, але я бачу повідомлення Android NDK: You might want to use $NDK/build/tools/build-stlport.sh. ПРИМІТКА: це не спрацювало за cygwin
Хтось десь

привіт, я можу створити додаток, яке використовує вектор.
CoDe

привіт, я додав APP_STL: = stlport_static у файл Application.mk, і він працює для мого додатка, але той самий додаток, який я включаю в Android Source, тут видає мені помилку "векторний клас не знайдений .." під час компіляції коду. PLS пропонують мені хтось має про це уявлення.
CoDe

1
Можливо, ви можете завантажити зразок свого проекту в github і поділитися URL-адресою, тоді ми можемо поглянути.
Себастьян Рот,

20

Якщо ви використовуєте Android studio, і ви все ще бачите повідомлення "помилка: вектор: немає такого файлу або каталогу" (або інші помилки, пов'язані зі stl) під час компіляції за допомогою ndk, то це може вам допомогти.

У своєму проекті відкрийте файл build.gradle модуля (не build.grade вашого проекту, а той, який відповідає вашому модулю) і додайте 'stl "stlport_shared"' в елемент ndk у defaultConfig.

Наприклад, наприклад:

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?
ІгорГанапольський

9

Я використовую Android Studio, і станом на 19 січня 2016 року це зробило для мене фокус. (Це здається чимось, що змінюється щороку або близько того)

Перейдіть до: 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 build працює нормально, і її успішно генерують .so-файли, але файли заголовків відсутні, ви маєте про це уявлення? (Я використовую андроїд-студію з експериментальним плагіном
gradle

Це з плагіном gradle-expert?
Себастьян Рот,

Чому gnustl_sharedзамість gnustl_static?
Ігор Ганапольський

Працює, я думаю, це слід вибрати як відповідь.
Вішнудев К

Я спробував це з останньою версією Android Studio 2.1.3, і, здається, це не працює. Щоб перевірити його, я взяв зразок програми HelloJNI, перейменований у hello-jni.c у .cpp і додав до нього #include <vector>. Я отримую помилку: fatal error: 'vector' file not found #include <vector>чи потрібні додаткові кроки після додавання stl = "gnustl_static" або "gnustl_shared" до файлу gradle модуля?
SideLobe 02

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. Я додаю файл Application.mk в ту саму папку jni і вставляю один (і лише один) рядок:

APP_STL := stlport_static

Але, на жаль, це не вирішує моєї проблеми! Я повинен додати ці 3 рядки в Android.mk, щоб вирішити це:

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", ви маєте на увазі папку jni проекту Android? Я хочу переконатися, що немає іншого місця, про яке я мав би знати. примітка: це хороше посилання для обміну зараз мертве :(
Hunter-Orionnoir

4

Дозвольте додати трохи до відповіді Себастьяна Рота.

Ваш проект можна скомпілювати за допомогою ndk-buildкомандного рядка після додавання коду, розміщеного Себастьяном. Але як на мене, в Eclipse були синтаксичні помилки, і я не мав завершення коду.

Зверніть увагу, що ваш проект повинен бути перетворений на проект C / C ++.

Як конвертувати проект C / C ++

Щоб вирішити цю проблему, клацніть правою кнопкою миші на своєму проекті, клацніть Властивості

Виберіть C / C ++ General -> Paths і символів і включати ${ANDROID_NDK}/sources/cxx-stl/stlport/stlportв Включають каталоги

Клацніть Так, коли з’явиться діалогове вікно.

Діалогове вікно

Раніше

Раніше

Після

Після

Оновлення №1

GNU C. Додавання каталогів, відновлення. Там не будуть якісь - або помилки в C вихідні файли
GNU C ++. Додавання каталогів, відновлення. У вихідних файлах CPP помилок не буде .


3

Якщо ви використовуєте ndk r10c або пізнішої версії, просто додайте APP_STL = c ++ _ static до Application.mk


1

Ось що спричинило проблему в моєму випадку ( CMakeLists.txt):

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

Це робить невидимими всі раніше визначені включені каталоги. Після видалення / рефакторингу цього рядка все працює нормально.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.