今回はAndroid NDKから簡単にzip書庫ファイルにアクセスするためのライブラリ「libunzip.a」をビルド。Android NDKの標準ライブりへ登録。そして実際に利用してみる。
まずは以前作成したAndroid NDKでZIP書庫内のファイルリストを取得するのときのプロジェクトファイル「Test117.zip」をダウンロードする。
次にEasyProjectGenerator for Androidで雛形プロジェクトを作成する。今回はC++、HelloJNIを利用した。
そして作成したプロジェクトのjniフォルダの中に、先ほどダウンロードしたTest117.zipに含まれる「ioapi.h」「ioapi.c」「unzip.h」「unzip.c」の4ファイルを解凍する。
今回はライブラリをビルドするだけなので不要な「Test120.c」を削除する。
Eclipseでプロジェクトを読み込み、「Android.mk」を編集する。
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := libunzip LOCAL_SRC_FILES := ioapi.c unzip.c include $(BUILD_STATIC_LIBRARY)

APP_MODULES := libunzip
これでビルドすると「libunzip.a」ファイルが生成された。
次に「libunzip.a」をAndroid NDKの標準ライブラリとして登録してしまう。
NDKのフォルダ「C:\android-ndk\platforms\android-xxx\arch-arm\usr\lib\」を開き、その中へ「libunzip.a」をコピーする。
忘れずにヘッダーファイルの「ioapi.h」「unzip.h」の2ファイルをコピーする。これは「C:\android-ndk\platforms\android-xxx\arch-arm\usr\include\」へコピーする。これで標準ライブラリへの登録は終りだ。
まずは雛形となるプロジェクトをEasyProjectGenerator for Androidで作成。C++のHelloJNIとした。
Eclipseでプロジェクトを読み込み、Android.mkを編集する。
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)

#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"); }
これで実行すると、SDカード上に配置したzip書庫内のファイル一覧がログに出力された。
プロジェクトファイルをダウンロード