Javajni⽂件流读写_Android的NDK开发(5)————
AndroidJNI层实。。。
1、
在JNI层实现⽂件的读写操作的话,就要使⽤到linux的读写函数了。
2、打开⽂件
intopen(constchar*pathname,intflags,intmode);
返回值:为⼀个⽂件句柄(fd),供read、write等操作。
参数:
pathname: 打开的⽂件所在路径字符串。如
String filename ="/";
flags: ⽂件打开的⽅式
flag之间可以作“与”运算,如
open(filename, O_CREAT | O_RDWR,mode);
常⽤flags:
O_RDONLY 以只读⽅式打开⽂件
O_WRONLY 以只写⽅式打开⽂件
O_RDWR 以可读写⽅式打开⽂件。上述三种旗标是互斥的,也就是不可同时使⽤,但可与下列的旗标利⽤OR(|)运算符组合。
O_CREAT 若欲打开的⽂件不存在则⾃动建⽴该⽂件。
O_TRUNC 若⽂件存在并且以可写的⽅式打开时,此标志位会令⽂件长度重新清为0,也就是说⽂件内容清空。
O_APPEND 当读写⽂件时会从⽂件尾开始移动,也就是所写⼊的数据会以附加的⽅式加⼊到⽂件后⾯。
O_NONBLOCK 以不可阻断的⽅式打开⽂件,也就是⽆论有⽆数据读取或等待,都会⽴即返回进程之中。
O_SYNC 以同步的⽅式打开⽂件。
O_NOFOLLOW 如果参数pathname所指的⽂件为⼀符号连接,则会令打开⽂件失败。
O_DIRECTORY 如果参数pathname所指的⽂件并⾮为⼀⽬录,则会令打开⽂件失败。
mode: ⽂件存储权限
S_IRWXU00700 权限,代表该⽂件所有者具有可读、可写及可执⾏的权限。
S_IRUSR 或S_IREAD,00400权限,代表该⽂件所有者具有可读取的权限。
S_IWUSR 或S_IWRITE,00200 权限,代表该⽂件所有者具有可写⼊的权限。
S_IXUSR 或S_IEXEC,00100 权限,代表该⽂件所有者具有可执⾏的权限。
S_IRWXG 00070权限,代表该⽂件⽤户组具有可读、可写及可执⾏的权限。
S_IRGRP 00040 权限,代表该⽂件⽤户组具有可读的权限。
S_IWGRP 00020权限,代表该⽂件⽤户组具有可写⼊的权限。
S_IXGRP 00010 权限,代表该⽂件⽤户组具有可执⾏的权限。
S_IRWXO 00007权限,代表其他⽤户具有可读、可写及可执⾏的权限。
S_IROTH 00004 权限,代表其他⽤户具有可读的权限
S_IWOTH 00002权限,代表其他⽤户具有可写⼊的权限。
S_IXOTH 00001 权限,代表其他⽤户具有可执⾏的权限。
3、⽂件的读(read)操作
intread(intfd, unsignedchar*buf,intsize);
返回值:返回实际读取到的字节数,如果返回0,表⽰已到达⽂件尾或是⽆可读取的数据,此外⽂件读写位置会随读取到的字节移动。参数:
fd:表⽰⽂件句柄,是由open函数得到
buf:read()函数会把fd 所指的⽂件传送count个字节到buf指针所指的内存中
size:要读取的字节数
4、写⼊操作
intwrite (intfd,constunsignedchar*buf,intsize);
返回值:如果成功write(),就会返回实际写⼊的字节数。当有错误发⽣时则返回-1
参数:
fd:同上
buf:将要写⼊到⽂件⾥⾯的内容。
size:要写⼊的字节数
5、跳转操作
int64_t seek(intfd, int64_t pos,intwhence)
返回值:成功时则返回⽬前的读写位置,也就是距离⽂件开头多少个字节,若有错误则返回-1。
参数:
fd:同上
pos:跳转的相对量,可正可负,表⽰相对位置的前后关系
whence:跳转的⽅向,whence取值如下所⽰
intSEEK_SET = 0;//将读写位置指向⽂件头后再增加offset个位移量。
intSEEK_CUR = 1;//以⽬前的读写位置往后增加offset个位移量。
intEEK_END = 2;//将读写位置指向⽂件尾后再增加offset个位移量。
注:当size参数=0;whence = SEEK_END;时返回值即为⽂件⼤⼩。
6、关闭操作
intclose(intfd)
7、简单⽰例
效果图:
7.1、JNI代码:(有JNI_onLoad函数)
//fs.c
#include
#include
write的返回值#include
#include
#include
intfile_open(constchar*filename,intflags)
{
intfd;
fd = open(filename, flags, 0666);
if(fd == -1)
return-1;
returnfd;
}
intfile_read(intfd, unsignedchar*buf,intsize)
{
returnread(fd, buf, size);
}
intfile_write(intfd,constunsignedchar*buf,intsize) {
returnwrite(fd, buf, size);
}
int64_t file_seek(intfd, int64_t pos,intwhence)
{
if(whence == 0x10000) {
structstat st;
intret = fstat(fd, &st);
returnret
}
returnlseek(fd, pos, whence);
}
intfile_close(intfd)
{
returnclose(fd);
}
//jni.c
#define TAG "fs_jni"
#include
#include "jniUtils.h"
staticconstchar*constkClassPathName ="com/conowen/fs/FsActivity";
jint
Java_com_conowen_fs_FsActivity_NativeFileOpen( JNIEnv* env, jobject thiz,jstring filename,jint flags ){ constchar*filename_char = (*env)->GetStringUTFChars(env,filename, NULL);
returnfile_open(filename_char, flags);
}
jint
Java_com_conowen_fs_FsActivity_NativeFileRead(JNIEnv* env, jobject thiz,intfd,jbyteArray buf,jint size){ unsigned char*buf_char = (char*)((*env)->GetByteArrayElements(env,buf, NULL));
returnfile_read(fd, buf_char, size);
}
jint
Java_com_conowen_fs_FsActivity_NativeFileWrite(JNIEnv* env, jobject thiz,intfd,jbyteArray buf,jint size){ unsigned char*buf_char = (char*)((*env)->GetByteArrayElements(env,buf, NULL));
returnfile_write(fd, buf_char, size);
}
jlong
Java_com_conowen_fs_FsActivity_NativeFileSeek(JNIEnv* env, jobject thiz,intfd,jlong Offset,jint whence){ returnfile_seek(fd, Offset, whence);
}
jint
Java_com_conowen_fs_FsActivity_NativeFileClose(JNIEnv* env, jobject thiz,intfd){
returnfile_close(fd);
}
/******************************JNI registration.************************************/
staticJNINativeMethod gMethods[] = {
{"NativeFileOpen","(Ljava/lang/String;I)I", (void*)Java_com_conowen_fs_FsActivity_NativeFileOpen},
{"NativeFileRead","(I[BI)I", (void*)Java_com_conowen_fs_FsActivity_NativeFileRead}, {"NativeFileWrite","(I[BI)I", (void*)Java_com_conowen_fs_FsActivity_NativeFileWrite}, {"NativeFileSeek","(IJI)J", (void*)Java_com_conowen_fs_FsActivity_NativeFileSeek}, {"NativeFileClose","(I)I", (void*)Java_com_conowen_fs_FsActivity_NativeFileClose},
};
intregister_com_conowen_fs_FsActivity(JNIEnv *env) {
returnjniRegisterNativeMethods(env, kClassPathName, gMethods,sizeof(gMethods) /sizeof(gMethods[0])); }
//jniUtils.h
#ifndef _JNI_UTILS_H_
#define _JNI_UTILS_H_
#include
#include
#ifdef __cplusplus
extern"C"
{
#endif
intjniThrowException(JNIEnv* env,constchar* className,constchar* msg);
JNIEnv* getJNIEnv();
intjniRegisterNativeMethods(JNIEnv* env,
constchar* className,
constJNINativeMethod* gMethods,
intnumMethods);
#ifdef __cplusplus
}
#endif
#endif /* _JNI_UTILS_H_ */
//onLoad.cpp
#define TAG "fs_onLoad"
#include
#include "jniUtils.h"
extern"C"{
externintregister_com_conowen_fs_FsActivity(JNIEnv *env);
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论