2015-01-11 14 views
3

this question에 연결된 지침을 사용하여 Botan을 성공적으로 빌드하는 데 Eclipse를 사용하고 있었지만 Android Studio는 Android 개발 용 Eclipse를 대체하기로되어 있으므로 지금 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>을 받고해야하며, 어떻게 그것을 찾을 수 안드로이드 스튜디오를 지시 할 : 나는 다음과 같은 오류를 받고 있어요? 업데이트


내가 다음 메이크 파일을 발견 : .../작업/응용 프로그램/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) 

가 나는 추가 시도 line after LOCAL_CPPFLAGS :

LOCAL_C_INCLUDES := $(ANDROID_STL_INC) 

그러나 빌드가 영향을받지 않는 것처럼 보입니다. 다시 헤더 iosfwd에 동일한 원래의 실패를 내 편집 볼중인 경우

LOCAL_CPPFLAGS := SEE_IF_THIS_BREAKS_THE_BUILD 

를 보려면 :하지만, 동일한 오류, 그래서 나는 다음으로 LOCAL_CPPFLAGS을 편집했습니다. 따라서 편집 내용은 빌드의 일부가 아닙니다.

더 많은 정보를 제공하도록 Android Studio를 얻으려면 어떻게해야합니까? 실패하는 빌드 단계로 이동하는 방법을 파악할 수 있습니다. 현재 빌드 할 때 일시 중지 된 다음 오류 메시지가있는 창을 표시하지만 중간 단계를 모두 표시하지 않고 어떤 메이크 파일이 그 위치에 있는지 보여줄 수 있습니다.

답변

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를 사용합니다. 그래서 STLport가 명령 행과 Eclipse에서 어떻게 보이는지 (이 질문은 Android Studio에 관한 것이지만 C++ 런타임을 어떻게 처리해야하는지 보여줍니다).

# 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++ 공유 객체를 제공하고 Crypto ++ 공유 객체에 의존하며 libstlport_shared.so을 사용하는 샘플 프로젝트의 중요한 부분 (Application.mkAndroid.mk 포함)을 보여줍니다.


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

나는 정말 안드로이드 Studio를 사용하지 않는이 때문에 대한 답변이 없습니다. 그러나 다음을 빌드 파일에 추가하는 것이 도움이 될 수 있습니다.


한 가지 중요한 :

ndk { 
    moduleName "MyNativeModule" 
    stl "stlport_shared" 
    ldLibs "log", "z", "m" 
    cFlags "-I/some/include/path" 
} 

은 또한 다음을 참조 : 안드로이드 스튜디오 아래에 C++ 런타임을 지정하는 표준 방법이 될 것 같다 메모 (안드로이드에 대한 크로스 컴파일 경험) -mfloat-abi=softfp이 ARMv7a 대상에 대한 컴파일러 옵션인지 확인하십시오. -msoft-float은 ARMv7 대상에 대한 컴파일러 옵션입니다. 이는 ABI 호환성에 중요합니다.

-mfloat-abi=softfp을 생략하면 부표가 잘못 전달되고 Botan (또는 다른 라이브러리)이받는 float 값은 0.0f이됩니다. OpenSSL은이 결함을 겪습니다. Java 호출자의 모든 엔트로피 예측은 0.0f입니다.