Linux系统编译Android可用的MuPDF

公司有一个展示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,欢迎一起交流,一起进步!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值