NDK开发一开始接触的就是官方给的demo:HelloJni
不过里面的代码相当简单啦,然后我想写一个C语言来遍历手机的文件夹,然后android展示出来,功能就是这样了。
首先要去解决的问题就是怎么遍历;然后遇到的问题就是怎么把遍历出来的文件列表返回给android代码,直接贴代码吧
int total = 0;
char filePaths[100][256] = {""};
void searchdir(const char *path, const char *tempPath) {
DIR *dp;
struct dirent *dmsg;
if ((dp = opendir(path)) != NULL) {
chdir(path);
while ((dmsg = readdir(dp)) != NULL) {
if (!strcmp(dmsg->d_name, ".") || !strcmp(dmsg->d_name, "..")) {
continue;
}
if (dmsg->d_type == DT_DIR) {
char *filePath = malloc(strlen(tempPath) + strlen(dmsg->d_name) + 20);
strcpy(filePath, tempPath);
strcat(filePath, "/");
strcat(filePath, dmsg->d_name);
searchdir(dmsg->d_name, filePath);
free(filePath);
} else {
int size = strlen(dmsg->d_name);
if (strcmp(dmsg->d_name + (size - 4), ".mp3") == 0) {
char *filePath = malloc(strlen(tempPath) + strlen(dmsg->d_name) + 20);
strcpy(filePath, tempPath);
strcat(filePath, "/");
strcat(filePath, dmsg->d_name);
strcpy(filePaths[total], filePath);
free(filePath);
total++;
}
}
}
chdir("..");
closedir(dp);
}
}
以上是遍历手机的方法,其中,if (strcmp(dmsg->d_name + (size - 4), ".mp3") == 0)这个判断是,只选择mp3文件。二维数组filePaths,是存放所有遍历结果
执行完这个方法后,就是要把结果传回去的过程了
jobjectArray Java_com_example_hellojni_HelloJni_stringFromJNI(JNIEnv* env, jobject thiz) {
total = 0;
clock_t tick_start, tick_end;
double t;
char *dirpath = "/storage/emulated/0/";
tick_start = clock();
searchdir(dirpath, dirpath);
tick_end = clock();
double dtime = (double) (tick_end - tick_start) / CLOCKS_PER_SEC;
jclass objClass = (*env)->FindClass(env, "java/lang/String");
jobjectArray texts = (*env)->NewObjectArray(env, (jsize) ARRAY_LENGTH, objClass, 0);
jstring jstr;
int i = 0;
for (; i < ARRAY_LENGTH; i++) {
jstr = (*env)->NewStringUTF(env, filePaths[i]);
(*env)->SetObjectArrayElement(env, texts, i, jstr); //必须放入jstring
}
return texts;
}
其中变量dtime就是花费的时间,经过我的实验,C遍历时间比java要快很多,我扫描3k个文件夹,C花费3s左右,java花了20多s.
变量dirpath是我写死的扫描初始路径,应该因人而异,也可以由java那边传参数过来。
C这边就算是写完了!
java这边用String[] aa = stringFromJNI();接收下就可以了.
下一篇文章,我会分享下,java获取MP3文件的作者,专辑等信息遇到的乱码问题,两篇文章使用的是一个项目
地址:http://download.csdn.net/detail/xiaodousa/9618128