公司有一个展示PDF文件的产品需求。之前用的是腾讯的TBS。接入的时候是正常,但是过了一段时间之后,有新用户表示PDF文件不能展示,而之前正常展示的手机依然能展示。这个问题我调查一段时间,得出了一个结论(仅为推测):TBS框架需要在腾讯公司的内核支持下才能正常运行,早之前,这个内核存在于微信和QQ中,只要手机中有微信或者QQ就能正常使用TBS。但是后来腾讯公司把支持的内核从微信和QQ中转移到了QQ浏览器中,意思就是需要手机中有QQ浏览器才行,所以呢这个方案只能被抛弃,原因呢不言而喻。后来使用了android-pdf-viewer这个框架,但是这个框架有一个问题,就是展示不了PDF中的电子签章。而我们公司的产品主要就是就是为了展示这个电子签章,所以找到了需要编译的MuPDF。这个编译过程很让我头疼,其实编译过程很简单,比FFMPEG和JPEG编译都简单,但是呢,总是遇到一些奇葩的问题。我这里简单介绍一下编译过程和遇到的问题。
一、编译MuPDF
我的编译环境是Linux系统,首先保证Linux系统中安装了Android的SDK,关于SDK的安装算是烂大街的东西了,百度一大堆。我这里贴一下SDK和NDK下载的地址。之后要用到NDK,所以也要下载NDK
https://www.androiddevtools.cn/
1.下载MuPDF源码
git clone --recursive git://git.ghostscript.com/mupdf-android-viewer.git
这个下载时间还是很长的,因为下载了其依赖的其他三方库
2.执行make generate
进入到mupdf-android-viewer/jni/libmupdf,执行make generate
cd mupdf-android-viewer/jni/libmupdf
make generate
3.编辑local.properties文件
在mupdf-android-viewer根目录中创建local.properties文件
#创建local.properties文件
vim local.properties
#在文件中添加sdk和ndk路径,下面是我的路径,换成自己的路径即可
sdk.dir=/root/android/sdk/android-sdk-linux
ndk.dir=/root/android/ndk/android-ndk-r16
4.开始编译
在根目录,也就是刚刚创建了local.properties的目录中执行make指令
make
编译过程应该不会太长时间,编译成功与否直接从屏幕上的输出就能看到。成功后会在以下的路径输出相应的动态库和静态库
/mupdf-android-viewer/jni/build/intermediates/ndkBuild/debug/obj/local
这里包含了arm64-v8a,armeabi-v7a,x86,x86_64的包
5.结构介绍及引用
看mupdf-android-viewer这个项目的结构,其实和我们平时使用AS加载的项目结构差不多。
(1)app:主要是MuPDF这个库使用的代码,非常简单,一看就明了
(2)lib:已经写好的PDF展示的UI,如果你的产品UI和这个比较契合的话,代码copy直接就能使用。
(3)jni:里面包含了和native交互的代码,很重要。因为里面和native交互的代码都是指定的包名,所以我们需要把它放在指定的包名下,在你的项目中创建一个包名为 com.artifex.mupdf.fitz的库或者创建和你包名同级的文件夹都是可以的。(其实编译过程这个包名可以更改,我只是感觉必要性不大,所以没有实践的操作,网上也有相关的教程,可以试一试)
如果按照上面的过程操作基本上没啥问题,但是呢,遇到奇葩坑还是非常可能的,我就说一下我的几个坑
二、编译过程遇到的问题
1.clang: error: unable to execute command: Killed
这个错误很恶心,基本没啥log信息,就这么一句话,我一直以为是我SDK配置的问题,翻来覆去的配就是不行。我也没有去想百度一下这个错误,因为我感觉这个也不算一个明确的错误信息,可能找不到解决办法。然而我想错了,百度这句话,果然有解决办法,参考博客
原因:主要是因为swap区不够大(不懂,有兴趣的可以学习一下)
解决办法(我使用了第一种,第二种没试):
(1)请加大分区:
sudo fallocate -l 6G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
(2)开机自动挂载swap:
使用 vi 或 nano 在 /etc/fstab 文件底部添加如下内容:
/swapfile none swap sw 0 0
2.Gradle build daemon disappeared unexpectedly (it may have been killed or may have crashed)。
这个问题也很难受,主要是看不懂。不过幸好网上有解决的办法,也比较好找,参考博客
在mupdf-android-viewer这个根目录中有一个文件Makefile(编译过程中的make操作就是执行的这个文件)。默认执行的是debug,所以只需要在debug的指令下做如下修改
将
./gradlew assembleDebug
改为
./gradlew --no-daemon assembleDebug
3.SDK安装问题
这个问题我都不好意思讲,我以为sdk和ndk一下,下载下来就能直接用呢。其实是需要安装的。我们在找一些SDK安装的文章时,里面会让你下载全部的程序或者选择安装一些程序。其实选择的安装就行,因为全部安装会非常耗时,而且也会经常中断。编译的时候看看是缺少什么就选择安装什么就可以了。
我放一下我的demo,需要的下载试一下就行。项目中只有armeabi-v7a的动态库,需要其他的动态库或者静态库可以联系我。地址
如果有什么问题可以留言,或者加我QQ:954831816,欢迎一起交流,一起进步!