![]()
今回はデータ圧縮/解凍用のzlibを利用してzip書庫ファイル内のファイル一覧を取得する。
zlib自体はAndroid NDKに元々含まれているが、zlibの頒布ファイルにはzipファイルにアクセスするためのライブラリが用意されている。今回はそれを利用する。
http://www.zlib.net/からzlibのソースコードをダウンロードする。ダウンロードバージョンはZlib 1.2.5。
![]()
AndroidのプロジェクトをEasyProjectGenerator for Androidで生成する。今回はC++用のNativeViewプロジェクトにした。
![]()
ダウンロードしたzlibのソースコードの「zlib-1.2.5/ contrib/ minizip」フォルダに含まれる「ioapi.h」「ioapi.c」「unzip.h」「unzip.c」ファイルを、プロジェクトのjniフォルダ内に解凍する。
![]()
Eclipseでプロジェクトを開き、まずはAndroid.mkを編集して、「ioapi.c」「unzip.c」をビルド対象に入れる。
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := Test117 LOCAL_SRC_FILES := Test117.cpp ioapi.c unzip.c LOCAL_LDLIBS := -lz -ljnigraphics 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 <jni.h>
#include <android/bitmap.h>
#ifdef LOCAL_LOG
#include <android/log.h>
#endif
/* this function is from Android NDK bitmap-plasma , and modify for green color bug */
static uint16_t make565(int red, int green, int blue)
{
return (uint16_t)( ((red << 8) & 0xf800) |
((green << 3) & 0x07e0) |
((blue >> 3) & 0x001f) );
}
static void DrawBitmap(AndroidBitmapInfo* pBitmapInfo, void* pPixels)
{
int yy;
for(yy = 0; yy < pBitmapInfo->height; yy++)
{
int xx;
uint16_t* pLine = (uint16_t*)pPixels;
for(xx = 0; xx < pBitmapInfo->width; xx++)
{
pLine[xx] = make565(xx % 256,yy % 256,0);
}
// go to next line
pPixels = (char*)pPixels + pBitmapInfo->stride;
}
}
#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,"Test117","Found File in zip : %s",pszFileName);
}
nRet = unzGoToNextFile(zipFile);
}
unzClose(zipFile);
return 1;
}
extern "C"
JNIEXPORT void JNICALL Java_com_Test117_NativeView_RenderBitmap(JNIEnv * env, jobject obj, jobject bitmap)
{
Test("/sdcard/desire_img.zip");
AndroidBitmapInfo info;
void* pixels;
int ret;
if ((ret = AndroidBitmap_getInfo(env, bitmap, &info)) < 0)
return;
if (info.format != ANDROID_BITMAP_FORMAT_RGB_565)
return;
if ((ret = AndroidBitmap_lockPixels(env, bitmap, &pixels)) < 0)
return;
DrawBitmap(&info,pixels);
AndroidBitmap_unlockPixels(env, bitmap);
}
#include <stdio.h> #include <stdlib.h> #include "zlib.h" #define USE_FILE32API #if defined(USE_FILE32API) #define fopen64 fopen #define ftello64 ftell #define fseeko64 fseek #else #ifdef _MSC_VER #define fopen64 fopen #if (_MSC_VER >= 1400) && (!(defined(NO_MSCVER_FILE64_FUNC))) #define ftello64 _ftelli64 #define fseeko64 _fseeki64 #else // old MSC #define ftello64 ftell #define fseeko64 fseek #endif #endif #endif
![]()
これでSDカードにZIPファイルを配置してから実行すると、zip書庫内のファイルリストをログに出力できた。
プロジェクトファイルをダウンロード
