原文网址:http://www.ithao123.cn/content-10709539.html

使用NDK进行文件读写,有利于保存数据的安全性,项目需要,要文件读写从Java中处理搬到Linux平台,为了方便两个平台的代码维护一致,使用JNI进行重写编写;

public class MainActivity extends Activity implements OnClickListener {private String tag = getClass().getSimpleName();private TextView textView;private static final String filePath = "/mnt/sdcard/hello.txt";private int num = 0;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);textView = (TextView) findViewById(R.id.textView);findViewById(R.id.bt_add).setOnClickListener(this);findViewById(R.id.bt_del).setOnClickListener(this);findViewById(R.id.bt_update).setOnClickListener(this);findViewById(R.id.bt_select).setOnClickListener(this);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.bt_add:num++;JniFileTools.writeFile(filePath, ", "+num);textView.setText(JniFileTools.readFile(filePath));break;case R.id.bt_del:JniFileTools.deleteString(filePath, ", "+num);textView.setText(JniFileTools.readFile(filePath));if(num > 0){num--;}break;case R.id.bt_update:break;case R.id.bt_select:textView.setText(JniFileTools.readFile(filePath));break;default:break;}}
}

JNI接口:

package jni.file.tools;public class JniFileTools {private final static String tag = "JniFileTools";static {System.loadLibrary("opfile");}public final static native String readFile(String filePath);public final static native boolean writeFile(String filePath, String content);public final static native boolean deleteString(String filePath,String content);}

实现3个方法:

Java_jni_file_tools_JniFileTools_readFile();

Java_jni_file_tools_JniFileTools_writeFile();

Java_jni_file_tools_JniFileTools_deleteString();

JniFileTools.cpp

#include <jni.h>
#include"JniFileTools.h"
#include<stdlib.h>
#include<stdio.h>
#include<android/log.h>
#include <stdarg.h>void Log_i(const char* log, ...) {// 请引入#include <stdarg.h>va_list arg;va_start(arg, log);__android_log_vprint(ANDROID_LOG_INFO, "JniLogTools", log, arg);va_end(arg);
}void readFromFile(char* fileName, char *str) {FILE *fp;int n = 0;char strTemp[128];fp = fopen(fileName, "r");if (fp == NULL) {Log_i("readFromFile打开失败");return;}while (NULL != fgets(strTemp, sizeof(strTemp), fp)) {strcat(str, strTemp);}fclose(fp);return;
}unsigned char writeToFile(char* fileName, char* content, const char * mode) {FILE *fp;fp = fopen(fileName, mode); //w+ , "a+"if (fp == NULL) {fclose(fp);return false;}int length = strlen(content);for (int i = 0; i < length; i++) {fputc(content[i], fp);}fclose(fp);return true;
}char * jstringToChar(JNIEnv *env, jstring jstr) {char * rtn = NULL;jclass clsstring = env->FindClass("java/lang/String");jstring strencode = env->NewStringUTF("UTF-8");jmethodID mid = env->GetMethodID(clsstring, "getBytes","(Ljava/lang/String;)[B");jbyteArray barr = (jbyteArray) env->CallObjectMethod(jstr, mid, strencode);jsize alen = env->GetArrayLength(barr);jbyte * ba = env->GetByteArrayElements(barr, JNI_FALSE);if (alen > 0) {rtn = (char*) malloc(alen + 1); //new char[alen+1];memcpy(rtn, ba, alen);rtn[alen] = 0;}env->ReleaseByteArrayElements(barr, ba, 0);return rtn;
}jstring charTojstring(JNIEnv* env, const char* pat) {jclass strClass = env->FindClass("Ljava/lang/String;");jmethodID ctorID = env->GetMethodID(strClass, "<init>","([BLjava/lang/String;)V");jbyteArray bytes = env->NewByteArray(strlen(pat));env->SetByteArrayRegion(bytes, 0, strlen(pat), (jbyte*) pat);jstring encoding = env->NewStringUTF("utf-8");return (jstring) env->NewObject(strClass, ctorID, bytes, encoding);
}char *delSubstr(char *str, char *delstr) {char *p, *q;char *src, *dst;dst = src = str;while (*src != '\0') {p = src;q = delstr;while (*p == *q && *q != '\0') {p++;q++;}if (*q == '\0') {src = p;} else {*dst++ = *src++;}}*dst = '\0';return str;
}JNIEXPORT jstring JNICALL Java_jni_file_tools_JniFileTools_readFile(JNIEnv * env, jclass cls, jstring filePath) {char str[1024];memset(str, 0, sizeof(str));readFromFile(jstringToChar(env, filePath), str);return (env)->NewStringUTF(str);
}JNIEXPORT jboolean JNICALL Java_jni_file_tools_JniFileTools_writeFile(JNIEnv * env, jclass cls, jstring filePath, jstring content) {writeToFile(jstringToChar(env, filePath), jstringToChar(env, content),"a+");return true;
}JNIEXPORT jboolean JNICALL Java_jni_file_tools_JniFileTools_deleteString(JNIEnv * env, jclass cls, jstring filePath, jstring content) {char str[1024];memset(str, 0, sizeof(str));readFromFile(jstringToChar(env, filePath), str);delSubstr(str,jstringToChar(env, content));writeToFile(jstringToChar(env, filePath),str,"w+");return true;
}

Android.mk

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE    := libopfile
LOCAL_SRC_FILES := \JniFileTools.cppLOCAL_LDLIBS :=-llog
LOCAL_LDLIBS    += -lGLESv2 -llog -ldl
include $(BUILD_SHARED_LIBRARY)

注意使用权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

本案例中涉及到有:
1 delSubstr()删除指定字符串;
2 jstring和char*之间的互相转换;
3 读写模式a+和w+;
4 封装输出日志到Logcat;

关于fopen()函数的几个使用:

读写方式有下列几种常用的形态:
r 以只读方式打开文件,该文件必须存在。
r+ 以可读写方式打开文件,该文件必须存在。
rb+ 读写打开一个二进制文件,允许读写数据,文件必须存在。
w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)
a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。 (原来的EOF符不保留)

【转】文件读写NDK(或Linux)相关推荐

  1. linux文件读写 c语言,Linux 下 C语言大文件读写(大于4G)

    以下的做法整理自论坛上的帖子. 如何create大文件 要大就非常大,1T吧. 有两种方法: 一.dd dd if=/dev/zero of=1T.img bs=1G seek=1024 count= ...

  2. 外网访问arm嵌入式linux_嵌入式Linux系统编程——文件读写访问、属性、描述符、API

    Linux 的文件模型是从 Unix 的继承而来,所以 Linux 继承了 UNIX 本身的大部分特性,然后加以扩展,本章从 UNIX 系统接口来描述 Linux 系统结构的特性. 操作系统是通过一系 ...

  3. Linux文件读写机制及优化方式

    本文只讨论Linux下文件的读写机制,不涉及不同读取方式如read,fread,cin等的对比,这些读取方式本质上都是调用系统api read,只是做了不同封装.以下所有测试均使用open, read ...

  4. linux存储--从内核文件系统看文件读写过程(四)

    系统调用 操作系统的主要功能是为管理硬件资源和为应用程序开发人员提供良好的环境,但是计算机系统的各种硬件资源是有限的,因此为了保证每一个进程都能安全的执行.处理器设有两种模式:"用户模式&q ...

  5. linux系统怎么查看权限设置密码,linux系统怎么查看及修改文件读写权限设置

    在linux中查看与修改文件权限我们都必须使用命令来操作,不能像windows一样点几下就好了,那么linux系统怎么查看及修改文件读写权限设置?接下来大家跟着学习啦小编一起来了解一下linux系统查 ...

  6. _int64_在Linux对应对文件,LInux 编程基础学习笔记 持续ing 文件读写

    一.文件读写 1.创建文件: 头文件: 函数:creat(char *path,int mode)  mode:S_I(R|W|X)(USR|GRP|OTH)   对不同用户组的不同读写执行 2.打开 ...

  7. Linux高级编程--05.文件读写

    缓冲I/O和非缓冲I/O 文件读写主要牵涉到了如下五个操作:打开.关闭.读.写.定位.在Linux系统中,提供了两套API, 一套是C标准API:fopen.fclose.fread.fwrite.f ...

  8. Linux文件读写改权限详解

    Linux文件读写改权限详解 文件的rwx权限 [ r ] [ w ] [ x ] 该文件可读(read) 该文件可修改(write) 该文件可执行(execute) 注意:只有当该文件所在目录有写权 ...

  9. linux gcc编译下的文件读写操作

    linux下的文件操作 所有目录             1.文件及文件系统的定义             2.linux文件的类型             3.linux文件的权限          ...

最新文章

  1. android+命令行编译,打包生成apk文件,Android 使用Android Studio + Gradle 或 命令行 进行apk签名打包...
  2. 数人科技:打造服务传统金融平台
  3. HDU 4505 小Q系列故事——电梯里的爱情
  4. 关于vue.js element ui 表单验证 this.$refs[formName].validate()的问题
  5. uni-app 发送form-data参数的请求方式传值给后台
  6. Centos Linux 开启端口 - 解决Centos发布服务外网访问不了的问题
  7. 【英语学习】【医学】Unit 09 The Respiratory System
  8. python算法应用(二)——一些使用技巧
  9. STM32工作笔记0027---理解电阻的串联和并联
  10. 浅析指针(pointer)与引用(reference)
  11. 伍德里奇计量经济学第三章课后计算机作业,伍德里奇---计量经济学第7章部分计算机习题详解(STATA)...
  12. 微信小程序底部导航栏配置
  13. 人工智能研究所使用方法,持续更新~
  14. PDM的工程图纸管理解决方案
  15. 面对新的挑战,成为更好的自己--进击的技术er
  16. 关于Java对接读卡器遇到的坑Process finished with exit code -1073740940 (0xC0000374)
  17. 【转】让电脑更高效的魔法 – 浅谈高效率PC工作环境的简化、净化与建立方法...
  18. GoC编程工具、GoC软件、GoC编程PPT
  19. 后级功放机与单声道功放机的功能有哪些区别?
  20. EXP、IMP、EXPDP、IMPDP命令

热门文章

  1. 持续集成:部署发布篇
  2. C++常用方法笔记资料
  3. 数据库性能优化—分库分表
  4. kotlin学习笔记——内联函数
  5. javaCV - 视频截帧,清晰度调整,转gif,视频转音频
  6. python xlwt模块生成excel文件并写入数据 xlrd读取数据
  7. go 语言系列(二)基本数据类型和操作符
  8. 模拟请求分页式存储管理 ---4种置换算法
  9. angular组件--tips提示功能
  10. 插播面试题:海量数据求最大值Topk或者是最小值Topk