上一篇文章android JNI 实例 中,讲到了如何实现用一个JNI用来读写文件,但是只是实现了对接口的调用,并未写出在c文件中是怎样实现文件读写的,这篇文章将写出c语言的具体实现,把WriteFile方法的具体实现补充完整。
jstringJava_com_example_bootanim_FileOPT_WriteFile(JNIEnv *env,
jobjectthiz, jstring oldpath, jstring newpath){//oldFile ="/system/build.prop";
int from_fd;
int to_fd;
long file_len=0;
int ret=1;
char buffer[BUFFER_SIZE];
char *ptr;
//下面是把string转换成const char *型,在c语言中openfile的函数是constchar *
const char *oldfilea =(*env)->GetStringUTFChars(env, oldpath, 0);
const char *newfilea =(*env)->GetStringUTFChars(env,newpath,0);
ALOGI("jniooooffff:%s",oldfilea);
if((from_fd=open(newfilea,O_RDONLY | O_NOFOLLOW))==-1) {
ALOGI("jniooooxxx from_fd fail");//c文件中的log输出,参照后面的做法
return "0";
}
ALOGI("jniooooxxx to_fdopen");
if((to_fd=open(oldfilea,O_WRONLY|O_NOFOLLOW))==-1) {
ALOGI("jniooooxxx to_fd= fail");
return "0";
}
file_len=lseek(from_fd,0L,SEEK_END);
lseek(from_fd,0L,SEEK_SET);
ALOGI("jniooooxxxwhile");
while(ret) {
ret= read(from_fd, buffer, BUFFER_SIZE);
if(ret==-1){
ALOGI("jniooooxxx ret==-1");
return "0";
}
write(to_fd, buffer, ret);
file_len-=ret;
bzero(buffer,BUFFER_SIZE);
}
ALOGI("jniooooxxxclose");
close(from_fd);
close(to_fd);
return (*env)->NewStringUTF(env," opecccccccc!");
}
关于jni输出log,参照下面做法:
1.在android.mk中加入LOCAL_STATIC_LIBRARIES:= libcutils liblog
2.在.c文件中加入:
#include<utils/Log.h>
#include<stdlib.h>
3.ALOGI("jniooooffff:%s",oldfilea);//jniooooffff为TAG,oldfilea是我们要输出的字符串。