Android NDKでのオープンソースライブラリの構築

こんにちは、Habralyudi!



Android NDKを使用する過程で、Android NDK上に既存のLinuxライブラリを構築する問題に遭遇しました。 この記事にはあまり資料がないので、私の経験を共有します。 私はAndroidが初めてなので、エラーを見つけた場合は書いてください:)



この例が同時に最も単純で有用ではないように、libFLACライブラリーを取り上げましょう。 これにより、.flacファイルをデコードできるようになります。 このマニュアルによれば、他のほとんどのライブラリが組み立てられることを望んでいます。



それに加えて、次のものが必要になります。



プロジェクト作成




標準の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が表示されます。

プロジェクト全体のソースは次のとおりです。

ソースコード

頑張って



All Articles