概述
Android作为一种基于Linux的自由及开放源代码的操作系统,多年来与iOS构成双垄断的局面,占据移动操作系统的半壁江山,拥有非常广泛的客户群。
诚迈科技是早期加入Android市场的软件供应商之一,多年来为相关客户提供全套的Android操作系统解决方案,在手机、平板、汽车等行业都做出了不错的成绩,有丰富的技术开发经验。
诚迈科技在本文要和大家分享的是——Android开发之网上文件快速扫描的实操指南。
网上文件快速扫描分为两种:
一、依赖系统的MediaStore,即等待系统扫描完成后,再去读取数据库,这一种依赖性太强,而且部分OS在一块的处理逻辑并不一样,兼容性较差,速度也不太快。
二、在Java中编写文件的目录层次递归扫描,这种耦合性和依赖性较低,但是这种方法却又较慢,毕竟Java的执行速度就比C要慢。
下面,我们介绍一种采用JNI编写的快速文件扫描。阅读本文章需要一定的JNI编程基础,同时也需要对Linux下的C语言的库函数有一定的了解。
这里就不细说如何创建AS工程,直接上干货:
代码设计思路:JAVA层代码通过调用native方法并传入需要扫描的目录路径进入到JNI的so库中的相关方法中,然后在so库中对目录路径下的子文件进行遍历扫描,若包含子目录,则进入递归扫描状态,扫描到文件后,将文件路径回传给java层,java层收到文件路径后,可以先add到一个List中,待完全退出native方法后,对该List进行统一处理。
在cpp目录下,创建scan.cpp,include相关的头文件,核心代码如下:
extern "C"
void readFileList(JNIEnv* env, jobject thiz, const char *basePath)
{
DIR *dir;
struct dirent *ptr;
if ((dir = opendir(basePath)) == NULL) {
LOGE("Open dir error: %sn", basePath);
return;
}
while ((ptr=readdir(dir)) != NULL) {
if(strcmp(ptr->d_name,".")==0 || strcmp(ptr->d_name,"..")==0 ||
(strchr(ptr->d_name, '.') != NULL
&& strcmp(ptr->d_name, strchr(ptr->d_name, '.')) == 0) ) {
continue;
} else if(ptr->d_type == 8) { // file
// basePath + ptr->d_name 就是文件的完整路径,此时可以回传给java层
} else if(ptr->d_type == 4) { // dir
char dirFilePath[1000];
memset(dirFilePath, '