日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

【转】文件读写NDK(或Linux)

發布時間:2024/4/14 linux 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转】文件读写NDK(或Linux) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原文網址: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)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。