Eclipse-CDT не может найти символы stdlib в проекте NDK - PullRequest
8 голосов
/ 31 декабря 2011

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

Я добавил ${NDK_ROOT}/sources/cxx-stl/gnu-libstdc++/include/ к путям включения моего проекта, и встроенный #includes разрешен. Однако попытка фактически использовать любой класс 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, так что это в лучшем случае неудобное и неправильное «решение». Кажется странным, что эти заголовки будут работать, но другие не будут. Eclipse не может индексировать или разрешать заголовки GNU C ++?

Android.mk

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)

Application.mk

APP_STL := gnustl_shared

Редактировать: я настроил свой проект на основе:

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

Ответы [ 3 ]

3 голосов
/ 06 января 2012

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

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)
2 голосов
/ 23 марта 2012

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

  • Щелкните правой кнопкой мыши проект Android C ++ и выберите «Свойства».
  • В разделе C / C ++ General нажмите «Анализ кода»
  • Переключиться на «Использовать настройки проекта»
  • Переключите все ошибки, которые вы получаете из-за использования векторного класса, на «предупреждения».

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

  • «Символ не разрешен»
  • "Объявление участника не найдено"
  • «Недопустимый аргумент шаблона»
  • "Неверные аргументы"
  • «Метод не может быть решен»

Как я уже сказал, это не идеально, и вы можете пропустить реальные ошибки из-за этого, но вы все равно получаете возможность обычно выбирать «Перейти к декларации» и некоторые возможности проверки синтаксиса, а также возможность запуска вашей программы. Шаг ndk-build в любом случае поймает любые реальные ошибки, так что это действительно не большая потеря. Честно говоря, я не уверен в источнике этой проблемы. Вероятно, это ошибка Eclipse.

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

Удачи!


Редактировать (продолжение):

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

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


$ NDK_DIR / платформы / андроида-14 / арка-x86 / USR / включать


к вашему списку включает также затмение.

0 голосов
/ 17 августа 2014

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

...