Нет такого файла & lt; iosfwd & gt; при сборке Botan под Android Studio?

Я успешно использовал Eclipse для сборки Botan, используя указания, связанные с этот вопрос, тем не менее, Android Studio должна заменить Eclipse для разработки под Android, поэтому я пытаюсь заставить его встроиться в Android Studio сейчас, но не получается с отсутствующим заголовочным файлом. <iosfwd>, Я получаю следующую ошибку:

Error:Execution failed for task ':app:compileDebugNdk'.
> com.android.ide.common.internal.LoggedErrorException: Failed to run command:
/Users/User1/Development/android-ndk-r10d/ndk-build NDK_PROJECT_PATH=null APP_BUILD_SCRIPT=/Users/User1/application1/android/workspace/app/build/intermediates/ndk/debug/Android.mk APP_PLATFORM=android-19 NDK_OUT=/Users/User1/application1/android/workspace/app/build/intermediates/ndk/debug/obj NDK_LIBS_OUT=/Users/User1/application1/android/workspace/app/build/intermediates/ndk/debug/lib APP_ABI=all
Error Code:
2
Output:
In file included from /Users/User1/application1/android/workspace/app/src/main/jni/botan/botan_all.cpp:8:0:
/Users/User1/application1/android/workspace/app/src/main/jni/botan/botan_all.h:11:18: fatal error: iosfwd: No such file or directory
#include <iosfwd>
^
compilation terminated.
make: *** [/Users/User1/application1/android/workspace/app/build/intermediates/ndk/debug/obj/local/arm64-v8a/objs/app//Users/User1/application1/android/workspace/app/src/main/jni/botan/botan_all.o] Error 1

Где я должен получить заголовочный файл <iosfwd> От и как я могу поручить Android Studio, чтобы найти его?


Обновить

Я нашел следующий make-файл: … / workspace / app / src / main / jni / botan / Android.mk

# jni/botan/Android.mk:
LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := botan
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)
LOCAL_SRC_FILES := botan_all.cpp
LOCAL_CPPFLAGS := -DBOTAN_USE_GCC_INLINE_ASM=0

include $(BUILD_SHARED_LIBRARY)

Я попытался добавить строку после LOCAL_CPPFLAGS:

LOCAL_C_INCLUDES := $(ANDROID_STL_INC)

Но сборка кажется незатронутой, я получаю ту же ошибку, поэтому я попытался редактировать LOCAL_CPPFLAGS быть:

LOCAL_CPPFLAGS := SEE_IF_THIS_BREAKS_THE_BUILD

Чтобы увидеть, видны ли мои правки, но опять же, точно такой же исходный сбой в заголовке iosfwd, Так что, похоже, мои правки не являются частью сборки.

Как я могу получить Android Studio, чтобы дать больше информации, чтобы я мог выяснить, как добраться до этапа сборки, который не удается. В настоящее время, когда я собираю, он делает паузу, затем выдает окно с сообщением об ошибке, но не показывает все промежуточные шаги, чтобы получить его, что может показать, какие make-файлы получили его до этого момента.

3

Решение

Откуда мне взять заголовочный файл и как указать Android Studio, чтобы найти его?

Среда выполнения C ++ не включены с --sysroot потому что это зависит от времени выполнения C ++, которое вы хотите использовать.

$ cd /opt/android-ndk-r10
$ find . -name iosfwd
./sources/cxx-stl/gnu-libstdc++/4.6/include/iosfwd
./sources/cxx-stl/gnu-libstdc++/4.8/include/iosfwd
./sources/cxx-stl/llvm-libc++/libcxx/include/iosfwd
./sources/cxx-stl/stlport/stlport/iosfwd
./sources/cxx-stl/stlport/stlport/using/iosfwd

Я использую STLport, потому что GNU имеет токсичные условия лицензирования. Итак, вот как выглядит STLport из командной строки и в Eclipse (я знаю, что ваш вопрос касается Android Studio, но это показывает, как вы должны обрабатывать среду выполнения C ++).

Итак, мой скрипт сборки для библиотек, таких как Botan (я на самом деле собрал и протестировал его на Android) и Crypto ++, имеет следующее:

# If more than one library is using STLport, then all libraries in the
# APK ***must*** use the shared version.
# STLPORT_LIB=libstlport_static.a
STLPORT_LIB=libstlport_shared.so

if [ "$_ANDROID_ARCH" == "arch-arm" ]; then
if [ "$_ANDROID_ARMV7A" -ne 0 ]; then
STLPORT_ABI=armeabi-v7a
else
STLPORT_ABI=armeabi
fi
elif [ "$_ANDROID_ARCH" == "arch-x86" ]; then
STLPORT_ABI=x86
elif [ "$_ANDROID_ARCH" == "arch-mips" ]; then
STLPORT_ABI=mips
fi

export ANDROID_STL_INC="$ANDROID_NDK_ROOT/sources/cxx-stl/stlport/stlport/"export ANDROID_STL_LIB="$ANDROID_NDK_ROOT/sources/cxx-stl/stlport/libs/$STLPORT_ABI/$STLPORT_LIB"

Позже Makefile использует переменные среды, установленные в скрипте:

# Android cross-compile configuration. Works in conjunction with IS_CROSS_COMPILE.
#   See http://www.cryptopp.com/wiki/Android_(Command_Line).
ifeq ($(IS_ANDROID),1)
# CPP, CXX, AR, RANLIB, LD, etc are set in 'setenv-android.sh'
CXXFLAGS = -DNDEBUG -g2 -Os -pipe -fPIC
CXXFLAGS += -DCRYPTOPP_DISABLE_ASM $(ANDROID_FLAGS)
CXXFLAGS += --sysroot=$(ANDROID_SYSROOT) -I$(ANDROID_STL_INC)
LDLIBS += $(ANDROID_STL_LIB)
endif

А вот как это выглядит под Eclipse: Скомпилировать собственный общий объект C ++ с Android NDK. Ответ показывает важные части (в том числе Application.mk а также Android.mk) примера проекта, который предоставляет мой общий объект C ++, зависит от общего объекта Crypto ++ и использует libstlport_shared.so,


… как мне поручить Android Studio найти его …

У меня нет ответа на этот вопрос, потому что я не использую Android Studio. Но может быть полезно добавить следующее в ваш файл сборки. Кажется, это стандартный способ задания среды выполнения C ++ в Android Studio:

ndk {
moduleName "MyNativeModule"stl "stlport_shared"ldLibs "log", "z", "m"cFlags "-I/some/include/path"}

Также смотрите следующее:


Одно важное замечание (из моего опыта с кросс-компиляцией для Android). Быть уверенным -mfloat-abi=softfp опция компилятора для целей ARMv7a; а также -msoft-float опция компилятора для целей ARMv7 Это важно для совместимости ABI.

Если -mfloat-abi=softfp опущен, то значения с плавающей точкой будут переданы неправильно, и значение с плавающей точкой, которое получит Botan (или другие библиотеки), будет 0.0f, OpenSSL страдает этим недостатком — все оценки энтропии от Java-вызывающих 0.0f,

1

Другие решения