我正在使用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到达那一点。
答案 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.mk
和Android.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
。