Android:使用MuPdf开源库阅读PDF文件

一时兴起

因为自己前段时间一直在做故事会的一个客户端,当然是非官方版,主要是由于自己的兴趣所致。以前就挺喜欢看故事会的,所以就希望做一个故事会的客户端,在手机上随时随地地看。因为故事会的官方APP的体验实在是太差了,而且资源还不全(而且还收费),所以我就打算自己做一个,然后去收集网上的资源。因为网上的故事会是以PDF文件的形式出现的,刚开始我想调用手机上的软件例如WPS等来阅读,后来一想反正做那就做PDF文件阅读功能吧,反正也没做过,正好试试呗。

一波三折

说做就做,刚开始使用的开源库是PDFView,就结果来说,软件体积太大了,而且使用的时候加载有点慢了,所以当时就不是太想使用这个库。后来没办法妥协呗,想了一个折中的办法,在开始的时候,利用PDFView提供的方法将PDF文件转换成一张张的图片保存到手机里,等加载的时候直接使用Picasso等加载图片的库来加载本地图片,这样总体来说还是不错的,直接加载图片比直接解析PDF文件要快很多,所以就出现了第一个版本,有兴趣的可以下载看一看。

后来,又随便在网上搜了搜,又找到一个不错的开源库,也就是MuPdf,这个和PDFView相比体积小,只有原来的一半,这已经是一个很大的诱惑了,没什么比体积小更让人扛不住的了。然后就开始找一些实现代码,最后找到了一个Eclipse版本的,它的阅读方式是横屏滑动阅读,我更喜欢竖屏阅读,所以就改成用ListView来显示,而且重要的是可以直接去显示,而不需要生成图片在手机里(因为这个做了实现封装),所以我就改了改,然后使用LruCache来保证不会出现内存溢出的情况,Demo运行还是不错的。

因为我的那个故事会客户端是使用AndroidStudio开发的,所以必须把MuPdf移植到AndroidStudio上。因为MuPdf需要调用so文件,所以我就先做了一个Demo,看看能不能运行出来,结果没问题再移植,然后悲催就开始了!!

本来so接触的就不多(其实很少%>_<%),所以怎么导入就是一个大问题,去网上搜有的说是建立jniLibs文件夹,然后放在里面,然而并无卵用;还有的说将so文件压缩成jar文件,然后放在libs里面,同样无卵用,最后真是要崩溃了。折腾了一下午,出去吃个晚饭,路上又搜了一种解决方法,告诉自己回去再试最后一次,不行我就放弃了,吃完饭回来试一下居然可以了,终于不在停止运行了。

问题出在哪我想暂时是找不到了,大概就是因为运行是没有正确的加载so文件,所以一些底层方法不能调用而崩溃了。

解决方法

    task nativeLibsToJar(type: Zip, description: "create a jar archive of the native libs"){
        destinationDir file("$projectDir/libs")
        baseName "Native_Libs2"
        extension "jar"
        from fileTree(dir: "libs", include: "**/*.so")
        into "lib"
    }

    tasks.withType(JavaCompile){
        compileTask -> compileTask.dependsOn(nativeLibsToJar)
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

将这一段代码加在build.gradle里,同时将libmupdf.so文件放在如下位置: 


 


图中的Native_Libs2.jar是编译之后出现的,如果编译之后没有出现这个文件,那么可能就不会运行成功了。

哦,对了还要注意的是MuPdf的那些类的包名必须是com.artifex.mupdf,如下: 


 


不然好像也不能运行成功。

柳暗花明

因为在AndroidStudio上可以运行成功了,所以我就打算将原来的客户端重新改写一下,将PdfViewer替换成MuPdf,一来可以减小APK的体积,二来也不用将PDF文件转换成图片来显示,很方便,等完成之后再将软件上传上来让有兴趣的看看。

下载

MuPdf的Demo-Eclipse版

MuPdf的Demo-AndroidStudio版

故事会客户端-PDFView版

故事会客户端-MuPdf版


附:经朋友测试,发现如果打开的PDF文件如果是损坏的话,那么应用就直接崩溃了,其次如果快速的关闭和打开应用,那么应用也会崩溃。这里我上传一份解决上述问题的版本(AndroidStudio版),它解决了上述问题,其实也就是换了一个so库,不过确实不会崩溃就是了。还需要注意的是新版的加载so库的方法和旧版不一样,大家在build.gradle中可以看到。

新版下载


因为我现在提供的so库只有armeabi-v7a版本的,像是x86,armeabi等架构下的都没有,在其他的手机上都出现了不能运行的问题。所以痛定思痛,我决定学习一下源码编译,得到其他架构下的so文件,还好不是太难,主要就是配置一下环境,具体内容可以参见我的这篇博客《Android:ubuntu下编译MuPDF源码》。

猜你喜欢

转载自blog.csdn.net/bruce135lee/article/details/81488817