AndroidNDK開發之“檔案操作”

來源:互聯網
上載者:User

其實和上層沒什麼關係,主要是通過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;
}

有看不懂的地方可以留言,一起探討。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.