1.创建目录操作:
先判断要创建的目录是否存在,如果已经存在,返回状态0;如果没有存在,就创建该目录,正确执行创建目录操作就返回0,否则返回错误状态1.
char * workDir = "/sdcard/UltimatumTest/";
if(0 == access(workDir,0)) {//目录存在
return 0;
} else{
if(0 == mkdir(workDir,777)) {
return 0;
}
else {
return 1;
}
}
写入操作核心片段:
char * strtowrite = Jstring2CStr(env,strToWrite);//将Java字符串对象转变成C语言中的字符串数组
FILE * file;
char * workDir = "/sdcard/UltimatumTest/";//要读写的文件所在目录
char *fileName = Jstring2CStr(env,inputFileName);//转换得到通过Java传来的文件文件名
char *filePath = (char *)malloc(sizeof(char)*50);//申请动态内存
strcat(filePath,workDir);
strcat(filePath,fileName);//得到文件完整路径
file = fopen(filePath,"a+");//如果文件存在就添加内容,如果文件不存在就创建新文件
fputs(iteminfo,file);//写入操作
fclose(file);//关闭文件流
free(filePath);/释放动态内存,防止内存泄露
return 0;正确 执行返回
所用到的讲Java字符串对象转变成C字符串的函数(注意这个函数有个缺陷,
它不能转换空对象,也不能转换空字符串元素的对象):
char* Jstring2CStr(JNIEnv* env, jstring jstr) {
char* rtn = NULL;
jclass clsstring = (*env)->FindClass(env, "java/lang/String");
jstring strencode = (*env)->NewStringUTF(env, "GB2312");
jmethodID mid = (*env)->GetMethodID(env, clsstring, "getBytes","(Ljava/lang/String;)[B");
jbyteArray barr = (jbyteArray)(*env)->CallObjectMethod(env, jstr, mid,
strencode); // String .getByte("GB2312");
jsize alen = (*env)->GetArrayLength(env, barr);
jbyte* ba = (*env)->GetByteArrayElements(env, barr, JNI_FALSE);
if (alen > 0) {
rtn = (char*) malloc(alen + 1); //"\0"
memcpy(rtn, ba, alen);
rtn[alen] = 0;
}
(*env)->ReleaseByteArrayElements(env, barr, ba, 0); //释放内存
return rtn;
}
要包含的头文件列表:
#include
#include
#include
#include "com_example_ultimatumgame_GoldenWriter.h"
最后,也是最容易忽略的,在配置文件里加上对外存的读写权限: