2015-01-11 75 views
3

我正在成功地使用Eclipse来构建Botan,使用从this question链接到的方向,但是,Android Studio应该替换Eclipse for Android开发,所以我试图让它在Android Studio中构建,但它失败缺少头文件<iosfwd>。我收到以下错误:在Android Studio下构建Botan时没有此文件<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:... /工作区/应用/ src目录/主/ JNI /牡丹/ 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提供更多信息,以便我能够弄清楚它是如何进入失败的构建步骤的。目前,当我构建时,它会暂停,然后向窗口提供错误消息,但没有显示所有中间步骤,以显示哪些makefiles已将其指向该点。

回答

1

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

C++运行时是因为它依赖于C++要使用运行时包含--sysroot

$ 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++运行时)。

所以我像牡丹库构建脚本(其实我已经在Android上构建和测试它)和加密+具备以下条件:

# 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


... 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被省略,则浮动将被错误地传递,并且Botan(或其他库)接收的浮动值将是0.0f。 OpenSSL遭受这种缺陷 - 来自Java调用者的所有熵估计值为0.0f

相关问题