Eclipse-CDT не удается найти символы stdlib в проекте NDK

Я пытаюсь написать простое приложение для Android, используя NDK и c++. В частности, я хотел бы использовать gnustdc++, включенный в новейшую версию NDK (r7). Библиотека JNI скомпилирована и отлично работает как C, но теперь, когда я пытаюсь представить C++, я столкнулся с некоторыми проблемами.

я добавил ${NDK_ROOT}/sources/cxx-stl/gnu-libstdc++/include/ к путям включения моего проекта и #includes inline разрешены. Однако, пытаясь использовать любой класс STL (например,vector) результаты в Symbol 'vector' could not be resolved.

все стандартные символы C, импортированные из <stdlib.h> и такая работа, пока я не попытаюсь заменить #include С <cstdlib>. Потом он выдает Function 'malloc' could not be resolved и так далее.

как ни странно, добавление заголовков stlport (в ${NDK_ROOT}/sources/cxx-stl/stlport/stlport) исправляет все мои вопросы. Однако я связываю в GNU C++, а не STLPort, так что это неудобное и неправильное "решение" в лучшем случае. Кажется странным,что эти заголовки будут работать, но другие не будут. Затмение не удается индексировать или разрешать заголовки GNU C++?

Android.МК

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := libfoobar-jni
LOCAL_SRC_FILES := foobar.cpp
LOCAL_LDLIBS := -llog -lGLESv2

LOCAL_C_INCLUDES := sources/cxx-stl/gnu-libstdc++/include/
LOCAL_CFLAGS := -g -std=c99

include $(BUILD_SHARED_LIBRARY)

применение.МК

APP_STL := gnustl_shared

Edit: я настроил свой проект на основе:

http://mhandroid.wordpress.com/2011/01/23/using-eclipse-for-android-cc-development/

3 ответов


прочитайте это, у него есть решение:

http://comments.gmane.org/gmane.comp.handhelds.android.ndk/14371

резюме, в случае, если ссылка когда-нибудь умрет, это:

это ошибка в объявлении модуля gnustl_shared. Извините за это, это будет исправлено в следующем выпуске. Тем временем, вы можете вручную изменить $NDK/sources/cxx-stl/gnu-libstdc++/Android.mk и замените строку, которая говорит:

LOCAL_EXPORT_LDLIBS := $(LOCAL_PATH)/libs/$(TARGET_ARCH_ABI)/libsupc++.a

С:

LOCAL_EXPORT_LDLIBS := $(call host-path,$(LOCAL_PATH)/libs/$(TARGET_ARCH_ABI)/libsupc++.a)

Я знаю, что это не идеальное решение, но, по крайней мере, это позволит вам нажать "выполнить" или "отладить" через Eclipse:

  • щелкните правой кнопкой мыши на проекте Android c++ и выберите Свойства.
  • В разделе C / C++ General нажмите "анализ кода"
  • переключиться на "Использовать настройки проекта"
  • переключите все ошибки, которые вы получаете из-за использования класса vector, чтобы быть "предупреждениями".

для меня, ошибки, которые мне нужно было переключить до сих пор являются:

  • символ"не решен"
  • "декларация участника не найдена"
  • "недопустимый аргумент шаблона"
  • "недопустимые аргументы"
  • "метод не может быть решен"

Как я уже сказал, это не идеально, и вы можете пропустить реальные ошибки из-за этого, но вы все равно получите возможность обычно выбирать "перейти к объявлению" и некоторые возможности проверки синтаксиса, а также возможность запуска вашей программы. Шаг сборки ndk поймает любые реальные ошибки в любом случае, так что это действительно не огромная потеря. Честно говоря, я не уверен в источнике этой проблемы. Скорее всего, это ошибка затмения.

вне темы, но актуально: вы также можете использовать ndk-gdb через eclipse. Учебник находится в блоге, связанном с OP, но вот прямая ссылка в любом случае.

удачи!


Edit (followup):

с тех пор я нашел способ обойти эту проблему, по крайней мере на моей коробке. ОП сказал, что в том числе заголовки STLPORT работали на него. Поначалу это было не для меня. Мне пришлось уничтожить проект Eclipse и начать все заново (по какой-то причине он не позволил мне удалить некоторые определения). Добавление STLPORT исправило некоторые проблемы, но в ndk r7b я все еще получал странные ошибки (например, NULL не был определен даже после включения stddef). В итоге мне пришлось включить заголовки x86. Они должны в значительной степени перекрываться с arm, однако полезно иметь arm "сверху" в порядке включения.

Итак, если вы столкнулись с той же проблемой, что и я, добавьте


$NDK_DIR / платформы / android-14/arch-x86 / usr / include


в ваш список eclipse также входит.


У меня эта проблема возникла в windows из-за различных форматов пути в cygwin, моей предпочтительной оболочке windows, и которая использует псевдо-пути стиля unix, а не windows. Если у вас есть эта проблема, и у вас есть cygwin, плавающий на вашем пути, eclipse может использовать его. Измените пути в Properties>C General>пути и символы, чтобы быть cygwin стиль, а не стиль windows (/cygwin/c/Android.... а не C:\Android...) ... в любом случае, это сработало для меня.