zoukankan      html  css  js  c++  java
  • AndroidNDK开发之“文件操作”

    其实和上层没什么关系,主要是通过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;
    }

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

  • 相关阅读:
    Hibernate 再接触 事务隔离机制
    Hibernate 再接触 一级缓存 二级缓存 查询缓存
    Hibernate 再接触 性能优化
    Hibernate 再接触 HQL
    Hibernate 再接触 树状结构设计以及学生课程成绩表的设计
    DotNetBar.MetroTilePanel 样式、加载数据、获取数据
    C# superGridControl 样式设置、加载数据、获取数据
    system.data.oracleclient 需要 8.17 需要oracle客户端问题
    程序员必备
    LinQ to sql
  • 原文地址:https://www.cnblogs.com/luxiaofeng54/p/1967190.html
Copyright © 2011-2022 走看看