2015-01-11 74 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

相關問題