Android NDKの標準ライブラリにlibunzipを追加して利用する

libunzip01.png
今回はAndroid NDKから簡単にzip書庫ファイルにアクセスするためのライブラリ「libunzip.a」をビルド。Android NDKの標準ライブりへ登録。そして実際に利用してみる。

まずは以前作成したAndroid NDKでZIP書庫内のファイルリストを取得するのときのプロジェクトファイル「Test117.zip」をダウンロードする。

libunzip02.png
次にEasyProjectGenerator for Androidで雛形プロジェクトを作成する。今回はC++、HelloJNIを利用した。

libunzip03.png
そして作成したプロジェクトのjniフォルダの中に、先ほどダウンロードしたTest117.zipに含まれる「ioapi.h」「ioapi.c」「unzip.h」「unzip.c」の4ファイルを解凍する。

libunzip04.png
今回はライブラリをビルドするだけなので不要な「Test120.c」を削除する。

libunzip05.png
Eclipseでプロジェクトを読み込み、「Android.mk」を編集する。

今回は.aファイルを作成するのでBUILD_STATIC_LIBRARYを指定するのがポイントだ。
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := libunzip
LOCAL_SRC_FILES := ioapi.c unzip.c

include $(BUILD_STATIC_LIBRARY)
libunzip06.png BUILD_STATIC_LIBRARYを指定しただけでは.aファイルはビルドされないので、「Application.mk」を編集してAPP_MODULE指定をする。
APP_MODULES := libunzip

libunzip07.png
これでビルドすると「libunzip.a」ファイルが生成された。

libunzip08.png
次に「libunzip.a」をAndroid NDKの標準ライブラリとして登録してしまう。

NDKのフォルダ「C:\android-ndk\platforms\android-xxx\arch-arm\usr\lib\」を開き、その中へ「libunzip.a」をコピーする。

libunzip09.png
忘れずにヘッダーファイルの「ioapi.h」「unzip.h」の2ファイルをコピーする。これは「C:\android-ndk\platforms\android-xxx\arch-arm\usr\include\」へコピーする。これで標準ライブラリへの登録は終りだ。






libunzip10.png
最後に実際にlibunzipを利用してみる。

まずは雛形となるプロジェクトをEasyProjectGenerator for Androidで作成。C++のHelloJNIとした。

libunzip11.png
Eclipseでプロジェクトを読み込み、Android.mkを編集する。

libunzipを利用するため、LOCAL_LDLIBSに「-lz」と「-lunzip」を追加する。
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := Test121
LOCAL_SRC_FILES := Test121.cpp
LOCAL_LDLIBS += -lz -lunzip 

LOCAL_IS_SUPPORT_LOG := true
ifeq ($(LOCAL_IS_SUPPORT_LOG),true)
	LOCAL_LDLIBS += -llog
endif

include $(BUILD_SHARED_LIBRARY)

libunzip12.png そしてテストするためのメイン処理を実装する。普通にunzip.hをincludeして利用するだけだ。
#if(true)
#define LOCAL_LOG
#define LOCAL_LOGD
#endif

#include <string.h>
#include <jni.h>

#ifdef LOCAL_LOG
#include <android/log.h>
#endif


#include <stdio.h>
#include <string.h>

#include <unzip.h>

#define	MAX_PATH	256

int		Test(const char* pszZipFile)
{
	int		nRet;
	unzFile	zipFile = unzOpen(pszZipFile);

	nRet = unzGoToFirstFile(zipFile);
	while(nRet == UNZ_OK)
	{
		unz_file_info	info;
		char	pszFileName[MAX_PATH];

		nRet = unzGetCurrentFileInfo(zipFile,&info,pszFileName,MAX_PATH,NULL,0,NULL,0);
		if(nRet == UNZ_OK)
		{
			__android_log_print(ANDROID_LOG_INFO,"Test121","Found File in zip : %s",pszFileName);
		}

		nRet = unzGoToNextFile(zipFile);
	}
	unzClose(zipFile);

	return	1;
}


extern "C"
jstring Java_com_Test121_Test121Act_stringFromJNI(JNIEnv* env,jobject thiz)
{
	Test("/sdcard/desire_img.zip");

	return env->NewStringUTF("Test121text");
}

libunzip13.png
これで実行すると、SDカード上に配置したzip書庫内のファイル一覧がログに出力された。




プロジェクトファイルをダウンロード


カテゴリー「android」 のエントリー