其實和上層沒什麼關係,主要是通過C來完成檔案的基本操作。不好意思大家,時間不夠,不多說,貼上關鍵代碼。
關鍵檔案代碼:
MainActivity.java
package com.scan.file;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity {
private static final String TAG = "File";
private Button doc = null;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
initControls();
}
/**
* 初始化控制項
*/
public void initControls() {
doc = (Button) this.findViewById(R.id.btn_do_c);
doc.setOnClickListener(new MyButtonOnClickListener());
}
/**
* 監聽ButtonOnClick
*
* @author lxf
*
*/
class MyButtonOnClickListener implements OnClickListener {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_do_c:
String do_c_result = doCMethod();
displayMessage(do_c_result);
break;
}
}
}
/*
* Toast顯示訊息
*/
private void displayMessage(String msg) {
Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
}
/**
* 測試方法
*
* @return
*/
public native String sayHello();
/**
* 執行C底層的方法
*
* @return
*/
public native String doCMethod();
/*
* 載人本地庫檔案
*/
static {
System.loadLibrary("AndroidJni");
}
}
file.h
#include <string.h>
#include <stdio.h>
#include "define.h"
unsigned short File_Open(FILE_HANDLE** FileHandle, char* name, unsigned short flag,unsigned short mode);
unsigned short File_Close(FILE_HANDLE* FileHandle);
unsigned short File_GetSize(FILE_HANDLE* FileHandle, unsigned long* FileSize);
unsigned short File_Read(FILE_HANDLE* FileHandle, char* buf, unsigned long count,unsigned long* ReadCount);
unsigned short File_Write(FILE_HANDLE* FileHandle, char* buf, unsigned long count,unsigned long* WriteCount);
unsigned short File_Seek(FILE_HANDLE* FileHandle, long offset, short origin,unsigned long* SeekLen);
unsigned short File_Delete(char* name);
unsigned short File_ISExist(char* path);
unsigned short File_Create_Dir(char* dirName);
unsigned short File_Delete_Dir(char* dirName);
Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := AndroidJni
LOCAL_SRC_FILES := AndroidJni.c File.c SyncmlEngine.c
LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -llog
include $(BUILD_SHARED_LIBRARY)
AndroidJni.c
#include <string.h>
#include <jni.h>
#include <android/log.h>
#include "SyncmlEngine.h"
//測試方法sayHello
jstring Java_com_scan_file_MainActivity_sayHello(JNIEnv* env, jobject thiz) {
//列印資訊出來
__android_log_print(ANDROID_LOG_INFO, "JNIMsg", "SayHello");
return (*env)->NewStringUTF(env, "Hello from JNI ! sayHello");
}
//執行C底層方法
jstring Java_com_scan_file_MainActivity_doCMethod(JNIEnv* env, jobject thiz) {
//列印資訊出來
__android_log_print(ANDROID_LOG_INFO, "JNIMsg", "doCMethod");
SyncmlStart();
return (*env)->NewStringUTF(env, "Do C Method OK!");
}
file.c
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#include <dirent.h>
#include <android/log.h>
#include "File.h"
/**
* File_Open--開啟檔案
* flag--讀\寫\讀寫\追加
* mode--如果沒有,是否建立
*/
unsigned short File_Open(FILE_HANDLE** FileHandle, char* name,
unsigned short flag, unsigned short mode) {
if (FileHandle == NULL) {
return 100;
}
if (name == NULL) {
return 100;
}
char type[128] = "";
if (flag == FO_OREAD) {
if (mode != FO_CREATE) {
strcpy(type, "r"); //唯讀,不建檔案
} else {
strcpy(type, "r+");
}
} else if (flag == FO_OWRITE) {
if (mode != FO_CREATE) {
strcpy(type, "w"); //唯寫,不建檔案
} else {
strcpy(type, "w+");
}
} else if (flag == FO_RW) {
if (mode != FO_CREATE) {
strcpy(type, "a");
} else {
strcpy(type, "a+");
}
} else if (flag == FO_APPEND) {
if (mode != FO_CREATE) {
strcpy(type, "a");
} else {
strcpy(type, "a+");
}
}
*FileHandle = fopen(name, type);
return 0;
}
/**
* File_Close--關閉檔案
* 傳回值
* 0--關閉成功;否則失敗
*/
unsigned short File_Close(FILE_HANDLE* FileHandle) {
if (FileHandle == NULL) {
return 100;
}
return fclose(FileHandle);
}
/**
* File_GetSize--得到檔案長度
* FileSize--返迴文件長度
*/
unsigned short File_GetSize(FILE_HANDLE* FileHandle, unsigned long* FileSize) {
if (FileHandle == NULL) {
return 100;
}
fseek(FileHandle, 0L, SEEK_END);
*FileSize = ftell(FileHandle);
return 0;
}
/**
* File_Read--讀取檔案到buf
* count--讀取的長度
* ReadCount--返回已讀取的長度
*/
unsigned short File_Read(FILE_HANDLE* FileHandle, char* buf,
unsigned long count, unsigned long* ReadCount) {
if (FileHandle == NULL) {
return 100;
}
*ReadCount = fread(buf, 1, count, FileHandle);
__android_log_print(ANDROID_LOG_INFO, "JNIMsg",
"File_Read ReadCount=%d", *ReadCount);
return 0;
}
/**
* File_Write--從buf中寫入檔案
* count--寫入的長度
* WriteCount--返回已寫入的長度
*/
unsigned short File_Write(FILE_HANDLE* FileHandle, char* buf,
unsigned long count, unsigned long* WriteCount) {
if (FileHandle == NULL) {
return 100;
}
unsigned short write_result = fwrite(buf, count, 1, FileHandle); // 傳回值是成功寫入的項目數
if(write_result == 1) {
*WriteCount = write_result * count;
}
return write_result;
}
/**
* File_Seek--給檔案位移量
* offset--位移量
* origin--位移方向
* SeekLen--返回已位移的長度
* 傳回值0--成功,其他失敗
*/
unsigned short File_Seek(FILE_HANDLE* FileHandle, long offset, short origin,
unsigned long* SeekLen) {
unsigned short seek_result = fseek(FileHandle, offset, origin);
if(seek_result == 0) {
*SeekLen = offset;
}
return seek_result;
}
/**
* File_Delete--刪除檔案
* 0--刪除成功 -1--刪除失敗
*/
unsigned short File_Delete(char* name) {
if (name == NULL) {
return 100;
}
return remove(name);
}
/**
* File_ISExist--判斷檔案是否存在
* 0存在 -1不存在
*/
unsigned short File_ISExist(char* path) {
if (path == NULL) {
return 100;
}
return access(path, 0);
}
/**
* File_Create_Dir--建立檔案目錄
* 返回0--成功
*/
unsigned short File_Create_Dir(char* dirName) {
if (dirName == NULL) {
return 100;
}
return mkdir(dirName, S_IRWXU);
}
/**
* File_Delete_Dir--刪除檔案目錄
*/
unsigned short File_Delete_Dir(char* dirName) {
if (dirName == NULL) {
return 100;
}
DIR* dp = NULL;
DIR* dpin = NULL;
char *pathname = (char*) malloc(256);
memset(pathname, 0, 256);
struct dirent* dirp;
dp = opendir(dirName);
if (dp == NULL) {
__android_log_print(ANDROID_LOG_INFO, "JNIMsg",
"File_Delete_Dir your input directory is not exist!");
return 100;
}
while ((dirp = readdir(dp)) != NULL) {
if (strcmp(dirp->d_name, "..") == 0 || strcmp(dirp->d_name, ".") == 0)
continue;
strcpy(pathname, dirName);
strcat(pathname, "/");
strcat(pathname, dirp->d_name);
dpin = opendir(pathname);
if (dpin != NULL) {
closedir(dpin);
dpin = NULL;
File_Delete_Dir(pathname);
} else {
remove(pathname);
}
}
rmdir(dirName);
closedir(dp);
free(pathname);
pathname = NULL;
dirp = NULL;
return 0;
}
有看不懂的地方可以留言,一起探討。