5

libraw を Android 共有ライブラリとしてビルドしようとしています。ライブラリが複雑すぎて Android.mk などで使用できないように見えますが、それ以上のことはできません。

NDK のスタンドアロン ツールチェーンを使用する方法を試しましたが、このライブラリをコンパイルするときにスタックしてしまいます。

これは、lib をコンパイルするためのパスです。明らかな誤りがある場合は指摘してください。

  1. ndkをダウンロードしました。
  2. 走った:make-standalone-toolchain.sh
  3. binそのスタンドアロン ツールチェーンのフォルダーを my の最初の項目として追加しましたPATH
  4. で走っ./configure--host=arm-linux-androideabi。これは成功しました
  5. Ran make、ここで非常に速くクラッシュしました。
    LibRaw-0.14.4$ make
    depbase=`エコー内部/dcraw_common.lo | sed の|[^/]*$|.deps/&|;s|\.lo$||'`;\
        /bin/bash ./libtool --tag=CXX --mode=compile arm-linux-androideabi-g++ -DPACKAGE_NAME=\"LibRaw\" -DPACKAGE_TARNAME=\"libraw\" -DPACKAGE_VERSION=\"0.14.4\" -DPACKAGE_STRING=\"LibRaw\ 0.14.4\" -DPACKAGE_BUGREPORT=\"info@libraw.org\" -DPACKAGE_URL=\"http://www.libraw.org\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H =1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_DLFCN_H=1 -DLT_OBJDIR=\".libs/\" -I. -I/usr/local/include -g -O2 -MT internal/dcraw_common.lo -MD -MP -MF $depbase.Tpo -c -o internal/dcraw_common.lo internal/dcraw_common.cpp &&\
        mv -f $depbase.Tpo $depbase.Plo
    libtool: コンパイル: arm-linux-androideabi-g++ -DPACKAGE_NAME=\"LibRaw\" -DPACKAGE_TARNAME=\"libraw\" -DPACKAGE_VERSION=\"0.14.4\" "-DPACKAGE_STRING=\"LibRaw 0.14.4\"" -DPACKAGE_BUGREPORT=\"info@libraw.org\" -DPACKAGE_URL=\"http://www.libraw.org\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H =1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_DLFCN_H=1 -DLT_OBJDIR=\".libs/\" -I. -I/usr/local/include -g -O2 -MT internal/dcraw_common.lo -MD -MP -MF internal/.deps/dcraw_common.Tpo -c internal/dcraw_common.cpp -fPIC -DPIC -o internal/.libs /dcraw_common.o
    internal/dcraw_common.cpp: メンバ関数 'void LibRaw::read_shorts(ushort*, int)':
    internal/dcraw_common.cpp:119: エラー: 'swab' はこのスコープで宣言されていませんでした
    internal/dcraw_common.cpp: メンバ関数 'void LibRaw::write_ppm_tiff()':
    internal/dcraw_common.cpp:9235: エラー: 'swab' はこのスコープで宣言されていませんでした
    make: *** [internal/dcraw_common.lo] エラー 1

このエラー メッセージがここ stackoverflow で役立つとは思えませんが、これを機能させるために追加のフラグまたは構成を適用する必要があるかどうか疑問に思っています。

クロスコンパイルせずにシステム用にコンパイルするだけで、このライブラリを正常にコンパイルできることに注意してください。(Linux 32 ビット)。

Android 用の GDAL をビルドするための手順 (ここ) を参照すると、追加の設定が使用されますLIBS="-lsupc++ -lstdc++"。これは STL と C++ の例外をリンクしますか? ただし、実行する前にそれらを設定すると、configure次のようなエラーがすぐに発生します。

configure:3018: C++ コンパイラが動作しているかどうかを確認しています
configure:3040: arm-linux-androideabi-g++ conftest.cpp -lsupc++ -lstdc++ >&5
/tmp/android-chain/bin/../lib/gcc/arm-linux-androideabi/4.4.3/../../../../arm-linux-androideabi/bin/ld: 見つかりません-lsupc++
collect2: ld が 1 つの終了ステータスを返しました

だから、私は少し立ち往生しています。誰かアイデア?

4

2 に答える 2

4

swabNDK には関数の実装がないため、関数の実装を追加する必要がありました。その後、これはうまくコンパイルされました(ただし、私はcrystax ndkを使用しました)。

ツールに関するより良い方法は、Android.mkファイルを使用ndk-buildしてコンパイルすることでした。

于 2012-01-09T16:34:27.847 に答える
2

NDK r7 から不完全なツールチェーンが作成されるため、質問の下部にあるリンカー エラーが発生しますmake-standalone-toolchain.sh(を含むいくつかのライブラリがありませlibsupc++.aん)。以前の NDK リリースの 1 つからツールチェーンを作成することをお勧めします (r6b は問題ないはずです)。

于 2011-12-24T16:06:39.267 に答える