jni层直接读取手机sdcard上的压缩文件

今天遇到一个需求,就是将一个zip文件读入内存进行处理。当然也可以是普通文件。

例如将sdcard/..../aaa.zip读入 char *的变量中。

jstring native_calculateSearchTime(JNIEnv *env, jobject obj,jstring assetsZipFileName, jstring txtFilePath) {

char *iBuf = NULL;
size_t len = 0;
int ret = -1;
char *fileName = (char *) (*env)->GetStringUTFChars(env, assetsZipFileName, 0);
char *txtPath = (char *) (*env)->GetStringUTFChars(env, txtFilePath, 0);
//--------------------------读取文件---------------------------
FILE *fd;
fd = fopen(fileName, "rw");

//--------------------------计算文件大小------------------------
ftell(fd);
jlong curpos;
//记录首地址
curpos = ftell(fd);
//移动到文件末尾
fseek(fd, 0L, SEEK_END);
//获取到首部的偏移,即为文件长度。
len = ftell(fd);
//返回首地址
fseek(fd, curpos, SEEK_SET);

//--------------------------读入缓冲区------------------------
iBuf = (char *) malloc(len);//申请内存大小
ret = fread(iBuf, sizeof(char), len, fd);
fclose(fd);

//其他业务操作
}

 

Android应用开发中,如果需要读取本地文件,可以通过JNI(Java Native Interface)来实现。 JNI是用于在Java代码与本地代码(C/C++)之间进行交互的一种技术。通过JNI,我们可以在Java代码中调用本地代码来访问系统底资源,例如读取本地文件。 以下是一种实现方式: 1. 创建一个Java类,用于加载本地库文件和声明本地方法。例如: ``` public class NativeFileReader { static { System.loadLibrary("native-library"); } public static native String readFile(String filePath); } ``` 2. 在本地代码中实现读取文件的方法,并将内容转换为字符串返回。例如: ``` #include <jni.h> #include <stdio.h> JNIEXPORT jstring JNICALL Java_com_example_NativeFileReader_readFile(JNIEnv* env, jclass clazz, jstring filePath) { const char* filePathStr = (*env)->GetStringUTFChars(env, filePath, NULL); FILE* file = fopen(filePathStr, "r"); if (file == NULL) { return NULL; } fseek(file, 0, SEEK_END); long fileSize = ftell(file); fseek(file, 0, SEEK_SET); char* buffer = malloc(fileSize + 1); fread(buffer, 1, fileSize, file); buffer[fileSize] = '\0'; fclose(file); (*env)->ReleaseStringUTFChars(env, filePath, filePathStr); jstring result = (*env)->NewStringUTF(env, buffer); free(buffer); return result; } ``` 3. 将本地代码编译为动态库文件,例如libnative-library.so。 4. 将生成的动态库文件放置到项目的jniLibs目录中。 5. 在Java代码中调用NativeFileReader类的readFile方法,传入要读取文件路径,就可以得到读取到的文件内容。例如: ``` String filePath = "/sdcard/example.txt"; String fileContent = NativeFileReader.readFile(filePath); ``` 这样,就能够通过JNI读取本地文件了。需要注意的是,为了保证文件读取的权限,需要在AndroidManifest.xml文件中添加文件读写权限的声明。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值