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

标签 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 达到了那个点。

最佳答案

Where should I be getting the header file from and how do I instruct Android Studio to locate it?

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 .答案显示了一个示例项目的重要部分(包括 Application.mkAndroid.mk),该示例项目提供了我的 C++ 共享对象,依赖于 Crypto++ 共享对象,并使用libSTLport_shared.so


... how do I instruct Android Studio to locate it...

我真的没有答案,因为我不使用 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,则 float 将被错误传递,Botan(或其他库)接收的浮点值将为 0.0f。 OpenSSL 有这个缺陷——所有来自 Java 调用者的熵估计都是 0.0f

关于c++ - 在 Android Studio 下构建 Botan 时没有这样的文件 <iosfwd>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27883298/

相关文章:

c++ - 派对日程-经典背包

c++ - 为什么这不起作用(glm::make_mat4)?

c++ - 将具有不同签名的 lambda 传递给泛型函数

java - 如何在新的更新 Oreo 8.1 中隐藏软键盘

java - 委托(delegate) Intellij Idea 代码生成

c++ - Qt "private slots:"这是什么?

java - 一键打开/关闭项目中的 native 支持

opengl-es - 写入 gl_FragColor 会导致 Android 上的 INVALID_OPERATION

qt - 将 AVFrame 转换为 RGB32 时在 sws_scale 处崩溃

java - Android AlertDialog 设置项目对齐中心