Android NDKを使用する過程で、Android NDK上に既存のLinuxライブラリを構築する問題に遭遇しました。 この記事にはあまり資料がないので、私の経験を共有します。 私はAndroidが初めてなので、エラーを見つけた場合は書いてください:)
この例が同時に最も単純で有用ではないように、libFLACライブラリーを取り上げましょう。 これにより、.flacファイルをデコードできるようになります。 このマニュアルによれば、他のほとんどのライブラリが組み立てられることを望んでいます。
それに加えて、次のものが必要になります。
- Android NDK、r5b(http://developer.android.com/sdk/ndk/index.html)
- libOgg(http://www.xiph.org/downloads/)
- libVorbis(libOggと同じ場所)。
プロジェクト作成
標準のAndroidプロジェクトを作成し、その中でjniフォルダーを作成し、そこにlibogg、libvorbis、libflacを解凍します。
組立
最初の段階に進みます。 アセンブリには、次のスクリプトを使用しました。
PREBUILT=/home/user/android-ndk-r5b/toolchains/arm-eabi-4.4.0 PLATFORM=/home/user/android-ndk-r5b/platforms/android-3/arch-arm export CC="/home/user/android-ndk-r5b/toolchains/arm-eabi-4.4.0/prebuilt/linux-x86/bin/arm-eabi-gcc" export CFLAGS="-fPIC -DANDROID -nostdlib" export ANDROID_ROOT="/home/user/android-ndk-r5b" export LDFLAGS="-Wl,-rpath-link=$ANDROID_ROOT/platforms/android-3/arch-arm/usr/lib/ -L$ANDROID_ROOT/platforms/android-3/arch-arm/usr/lib/" export CPPFLAGS="-I$ANDROID_ROOT/platforms/android-3/arch-arm/usr/include/" export LIBS="-lc " ./configure --host=arm-eabi
libVorbisの場合、少し変更する必要があります。
LDFLAGSは次のようになります。
export LDFLAGS="-Wl,-rpath-link=$ANDROID_ROOT/build/platforms/android-3/arch-arm/usr/lib/ -L$ANDROID_ROOT/build/platforms/android-3/arch-arm/usr/lib/ -L../../libs/armeabi/"
およびLIBS:
export LIBS="-lc -logg"
libflacの場合、変更してlibs -lvorbisに追加します。
スクリプトの構造を順番に検討してください。 エクスポートCC行は、Android NDKコンパイラーへのパスです。 ここ:LDFLAGSをエクスポートし、ライブラリを探すディレクトリを設定し、LIBSでそれらを接続します。 この行では、CPPFLAGSをエクスポートし、追加ライブラリのヘッダーを接続します。
各ライブラリのルートで必要なスクリプトを実行します。 アセンブリ後、すべてがうまくいけば、すでにNDKにコンパイルできるライブラリを取得できます。
Android.mkの準備
したがって、まず最初に、次の形式のAndroid.mkを作成します。
include $(all-subdir-makefiles)
フォルダー内:jni、jni / libogg、jni / libflac、jni / libvorbis
このスクリプトは、サブディレクトリ内のすべてのAndroid.mkが接続されることを意味します。
jni / libogg / src、jni / libvorbis / lib、jni / libflac / srcフォルダーにAndroid.mkを作成するには、同じフォルダー内のすべてのMakefile.amを使用します。
jni / libogg / src
Makefile.amで次の行を探します。
libogg_la_SOURCES = framing.c bitwise.cが必要です。 次の形式の標準Android.mkを取得します。
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := libogg LOCAL_C_INCLUDES := $(LOCAL_PATH) \ $(LOCAL_PATH)/../include/ LOCAL_SRC_FILES := framing.c bitwise.c include $(BUILD_SHARED_LIBRARY) #
何も説明する必要はないと思います。 続けましょう。
jni / libvorbis / lib
ここでも、すべてが簡単です。 libvorbis_la_SOURCESという行を見つけて、そこにあるすべてのファイルを有効にします。 次のAndroid.mkを取得します。
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := libvorbis LOCAL_C_INCLUDES := $(LOCAL_PATH) \ $(LOCAL_PATH)/../include \ $(LOCAL_PATH)/../../libogg/include # headers libogg LOCAL_SRC_FILES := mdct.c smallft.c block.c envelope.c window.c lsp.c \ lpc.c analysis.c synthesis.c psy.c info.c \ floor1.c floor0.c\ res0.c mapping0.c registry.c codebook.c sharedbook.c\ lookup.c bitrate.c\ LOCAL_SHARED_LIBRARIES := libogg # LOCAL_LDLIBS := -ldl -lGLESv1_CM -llog include $(BUILD_SHARED_LIBRARY)
jni / libflac / src
プロセスは同じですが、さらに多くのファイルがあり、サブディレクトリにあります。 簡単にするために1つのライブラリにすべてを集めることにしたので、このスクリプトを入手しました。
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := libFLAC LOCAL_C_INCLUDES := $(LOCAL_PATH)/libFLAC/include/ \ $(LOCAL_PATH)/../include/ \ $(LOCAL_PATH)/../../libogg/include/ \ $(LOCAL_PATH)/../../vorbis/include/ \ $(LOCAL_PATH)/share/include/ \ $(LOCAL_PATH)/share/utf8/ \ $(LOCAL_PATH)/../include/ \ $(LOCAL_PATH)/../include/share/ \ $(LOCAL_PATH)/share/replaygain_synthesis/include/ \ $(LOCAL_PATH)/../../libogg/include/ \ $(LOCAL_PATH)/../../vorbis/include/ \ $(LOCAL_PATH)/metaflac/include/ \ $(LOCAL_PATH)/../include/ \ $(LOCAL_PATH)/../include/share \ $(LOCAL_PATH)/../../libogg/include/ \ $(LOCAL_PATH)/../../vorbis/include/ \ $(LOCAL_PATH)/flac/ \ $(LOCAL_PATH)/../include/ \ $(LOCAL_PATH)/../../libogg/include/ \ $(LOCAL_PATH)/../../vorbis/include/ \ LOCAL_SRC_FILES := libFLAC/bitmath.c \ libFLAC/bitreader.c \ libFLAC/bitwriter.c \ libFLAC/cpu.c \ libFLAC/crc.c \ libFLAC/fixed.c \ libFLAC/float.c \ libFLAC/format.c \ libFLAC/lpc.c \ libFLAC/md5.c \ libFLAC/memory.c \ libFLAC/metadata_iterators.c \ libFLAC/metadata_object.c \ libFLAC/stream_decoder.c \ libFLAC/stream_encoder.c \ libFLAC/stream_encoder_framing.c \ libFLAC/window.c \ libFLAC/ogg_decoder_aspect.c \ libFLAC/ogg_encoder_aspect.c \ libFLAC/ogg_helper.c \ libFLAC/ogg_mapping.c \ share/getopt/getopt.c share/getopt/getopt1.c \ share/grabbag/cuesheet.c \ share/grabbag/file.c \ share/grabbag/picture.c \ share/grabbag/replaygain.c \ share/grabbag/seektable.c \ share/replaygain_analysis/replaygain_analysis.c \ share/replaygain_synthesis/replaygain_synthesis.c \ share/utf8/charset.c share/utf8/iconvert.c share/utf8/utf8.c \ metaflac/main.c \ metaflac/operations.c \ metaflac/operations_shorthand_cuesheet.c \ metaflac/operations_shorthand_picture.c \ metaflac/operations_shorthand_seektable.c \ metaflac/operations_shorthand_streaminfo.c \ metaflac/operations_shorthand_vorbiscomment.c \ metaflac/options.c \ metaflac/usage.c \ metaflac/utils.c \ flac/analyze.c \ flac/decode.c \ flac/encode.c \ flac/foreign_metadata.c \ flac/local_string_utils.c \ flac/utils.c \ flac/vorbiscomment.c \ LOCAL_SHARED_LIBRARIES := libogg libvorbis LOCAL_LDLIBS := -ldl -lGLESv1_CM -llog include $(BUILD_SHARED_LIBRARY)
そして最後の1つ:
NDKビルド
ndk-build(このスクリプトはNDKフォルダーにあります)を実行すると、すべてがコンパイルされますが、flacは次のエラーを返します。
/home/user/workspace/w/testOGG/jni/flac-1.2.1/src/libFLAC/format.c:60: error: 'VERSION' undeclared here (not in a function)
/home/user/workspace/w/testOGG/jni/flac-1.2.1/src/libFLAC/format.c:66: error: expected ',' or ';' before 'VERSION'
make: *** [/home/user/workspace/w/testOGG/obj/local/armeabi/objs/FLAC/libFLAC/format.o] 1
問題は、VERSION定数が含まれていないメイクファイルで定義されていることです。 format.cでこの定数を作成するのに最も簡単な方法は、次のとおりです。
#define VERSION "1.2.1"
すべてがエラーになりました。 コンパイルすると、次のものが得られます。
Install : libFLAC.so => libs/armeabi/libFLAC.so
Install : libogg.so => libs/armeabi/libogg.so
Install : libvorbis.so => libs/armeabi/libvorbis.so
次のファイルとフォルダーがディレクトリに表示されます。
ここで最後のことが残っています-すべてが機能するかどうかをテストする libflacを使用してオーディオをデコードする標準的な例からまとめました。 flacファイルからwavにデコードされます。 スクリプトコードが大きすぎるため、このapkで作業をテストできます 。 テストapkファイル
(すべてが機能するには、output.flacファイルがsdcardに含まれている必要があります:
05-20 14:18:42.783:INFO / FLAC(427):サンプルレート:44100 Hz
05-20 14:18:42.783:INFO / FLAC(427):チャンネル:2 Hz
05-20 14:18:42.783:INFO / FLAC(427):ビット:16 Hz、test2.wavにトランスコードされます。 プログラムを実行すると、何も書き込まれません(ログにのみ)。 エミュレータ、HTC Wildfire、Samsung galaxy tab(どこでもAndroid 2.2)でテスト済み。 20メガバイトのflacファイルを処理する場合、プロセスは1分もかかりませんでした。 終了すると、Hello worldが表示されます。
プロジェクト全体のソースは次のとおりです。
ソースコード
頑張って