3

この質問からリンクされている指示を使用して Eclipse を使用して Botan を正常にビルドしていましたが、Android Studio は Android 開発用に Eclipse を置き換えることになっているため、現在 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 にそれを見つけるように指示するにはどうすればよいですか?


アップデート

次のメイクファイルを見つけました: .../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 に詳細情報を提供するにはどうすればよいですか。現在、ビルドすると一時停止し、ウィンドウにエラーメッセージが表示されますが、そこに到達するためのすべての中間ステップは表示されず、どのメイクファイルがその時点まで到達したかが示される場合があります。

4

1 に答える 1

1

ヘッダーファイルはどこから取得する必要があり、Android Studio にそれを見つけるように指示するにはどうすればよいですか?

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

GNU には有毒なライセンス条件があるため、STLport を使用しています。コマンドラインとEclipseでSTLportがどのように見えるかを次に示します(あなたの質問が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 では次のようになります。 Android NDK を使用してネイティブ C++ 共有オブジェクトをコンパイルします。答えは、C++ 共有オブジェクトを提供Application.mkAndroid.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"
}

以下も参照してください。


1 つの重要な注意事項 (Android のクロスコンパイルに関する私の経験から)。-mfloat-abi=softfpARMv7a ターゲットのコンパイラ オプションであることを確認してください。-msoft-floatARMv7 ターゲットのコンパイラ オプションです。これは、ABI の互換性にとって重要です。

-mfloat-abi=softfpを省略すると、float が正しく渡されず、Botan (または他のライブラリ) が受け取る float 値は になります0.0f。OpenSSL にはこの欠陥があり、Java 呼び出し元からのエントロピーの見積もりはすべて0.0f.

于 2015-01-11T03:03:10.973 に答える