|
OpenCVを使うにはチト牛刀割鶏なので、png のライブラリを組み込むことにしました。以前、コンパイルしたstatic library をndk のディレクトリ下に置いて云々、というのをやった気がしましたが(ブログに残してないな?)、アレだとNDKのバージョンあげるたびに色々戻さないといけないので、今回はライブラリのコンパイルと組み込みは別でやる方向で。
ついでに、今Linux環境ないので、全部Windows で行いましょう。
あ、勿論Android NDK環境です。
-☆-
用意するもの
・git と、ndk-build が使えるようになっているcmd.exe。要はgitインストールして、ndk 開発環境が整っていれば大丈夫なはずです
ソースを取得します。
libpng のソースを持ってこないとならないんですが、Android用に出されているlibpng はちょっとコンパイルがメンドクサイので、 個人によってその旨修正されたソースをいただきましょう。ありがとうございます。
Android.mkの修正
取得したソースの jni/Android.mk を修正します。コメントアウトされているSHARED_LIB を有効にし、STATIC_LIBの方をコメントアウトします。
include $(BUILD_SHARED_LIBRARY)
#include $(BUILD_STATIC_LIBRARY)
ビルドする
cmd 上で
ndk-buld NDK_PROJECT_PATH=./
と実行すると、ビルドがサクサク進んでlibpng.so ができるはずです。ディレクトリセパレータは / のままでOKです。
プロジェクトへ組み込む
出来上がったlibpng.so と、持ってきたソースファイル中にあるヘッダ、png.h とpngconf.h をプロジェクトのjni 以下へコピーします。分かり易いようにサブディレクトリを分けると吉。
今回は
jni/libpng/include へ png.h,pngconf.h
jni/libpng/lib/へ libpng.so
とします。
プロジェクトのAndroid.mk を修正
libpng 用に新たなモジュールを作って、それを共用ライブラリとしてプロジェクトへ組み込む形です。
プロジェクトのAndroid.mk 冒頭に、その分の修正を行います。
LOCAL_PATH := $(call my-dir)
#libpng 用
include $(CLEAR_VARS)
LOCAL_MODULE := libpng-module
LOCAL_SRC_FILES := libpngl/lib/libpng.so
include $(PREBUILT_SHARED_LIBRARY)
#組み込むプロジェクト 用
include $(CLEAR_VARS)
LOCAL_MODULE := HogeHoge
LOCAL_SRC_FILES := hoge.cpp,fuga.cpp
LOCAL_LDLIBS += -ldl -llog -lGLESv1_CM
LOCAL_SHARED_LIBRARIES := libpng-module
LOCAL_C_INCLUDE := jni/libpng/include
include $(BUILD_SHARED_LIBRARY)
こんな感じ。libpng 用のコンパイル指示子はPREBUILT_SHARED_LIBRARYなので、他のモジュール(プロジェクト側)から読み込む際は、LOCAL_SHARED_LIBRARIES を指定します。
また、LOCAL_SRC_FILES で取り込むshared object は、それぞれのアーキテクチャに合わせたものにしないとならないはずなので、万が一NDKでx86バイナリ、なんていう環境の場合はその旨コンパイルあたりからどうにかしてください。shared object コンパイル時のApplication.mkの修正と、あとはTARGET_ARCH_ABI をみて取り込むパスを切り替えるだけでなんとかなると思いますが。
プロジェクトから使う
あとはプロジェクトのCソースなどから、png_create_read_strcut云々、とAPIを呼んでやればOKです。イエー。
あ、JavaのActivityあたりのソースから、loadLibrary("png" )するのを忘れないように!!
|