在Android Studio下构建Botan时没有这样的文件<iosfwd>?</iosfwd>

时间:2015-01-11 02:10:56

标签: c++ android-ndk android-studio botan iosfwd

我正在使用Eclipse成功地使用链接到this question的指示来构建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找到它?


更新

我找到了以下makefile:... / 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提供更多信息,以便我了解它如何进入失败的构建步骤。目前,当我构建时,它会暂停,然后给出带有错误消息的窗口,但是没有显示所有中间步骤以获取它,这可能会显示哪个makefile到达那一点。

1 个答案:

答案 0 :(得分:1)

  

我应该从哪里获取头文件以及如何指示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下的外观:Compile native C++ shared object with Android NDK。答案显示了提供我的C ++共享对象的示例项目的重要部分(包括Application.mkAndroid.mk),取决于Crypto ++共享对象,并使用libstlport_shared.so


  

...如何指示Android Studio找到它......

我真的没有答案,因为我不使用Android Studio。但是将以下内容添加到构建文件中可能会有所帮助。它似乎是在Android Studio下指定C ++运行时的标准方法:

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