使用MuPDF也有一段时间了,虽然不是太熟练,但是也能解决一般的问题了。从一开始不能把项目建起来,无法加载so文件,到现在基本都可以解决问题。然后一直的遗憾就是没有自己去编译源码得到so文件,一直都是用别人的so文件,而且还不全,只有armeabi-v7a,缺少armeabi、x86等so文件。所以就下定决心去自己编译源码。这么说总让人认为编译源码很难一样,其实很简单,只是自己一开始就畏惧了罢了。
我一直使用的系统都是ubuntu,所以编译也是基于ubuntu的。
首先需要做的就是要配置NDK,NDK的配置并不是很复杂,下载NDK然后放到一个目录,最后配置一下环境就可以了,这些都可以网上搜,所以就不多说了,放一个参考链接吧。
配置完之后在终端测试一下,如图
如果有这样的效果,说明就没有问题了。
下载源码的方式还是比较多的,这里提供两种:
git clone --recursive git://git.ghostscript.com/mupdf.git
使用git直接下载最新库。http://www.mupdf.com/downloads/
去这里可以下载最新的源码压缩包和之前版本的压缩包。因为最新的版本1.10和之前的版本1.6生成的so文件大小差很大,所以我使用了1.6的版本,不过编译过程基本没有差别。
下载完源码之后,里面的内容如下所示
一般情况下是不会出现问题的,网上提醒的就是看看thirdparty
是否存在。
然后在这个目录打开终端,输入命令make generate
就可以得到一个generated文件夹
,这样第一步就可以了。
然后进入到platform
文件夹,里面有android
文件夹,1.10的版本是进入android
之后还分为example
和viewer
文件夹,需要进入viewer
文件夹去执行下一步。不过1.6的版本直接进入android
文件夹就可以了,内容如下
里面有一个local.properties.sample
文件,将它改为local.properties
,然后将它里面的内容配置如下:
sdk.dir=/usr/local/mysoft/SDK
ndk.dir=/usr/local/mysoft/NDK
也就是配置SDK和NDK,因为网上的是这么说,但是后来我自己试验的时候发现并不需要也能成功。各位试验的时候可以尝试一下。
然后打开jni目录下的Application.mk
文件,内容如下:
APP_PLATFORM=android-8
APP_ABI := armeabi-v7a
#APP_PLATFORM=android-8
#APP_ABI := armeabi
#APP_PLATFORM=android-9
#APP_ABI := x86
#APP_PLATFORM=android-9
#APP_ABI := mips
看到,这个就是决定有哪些so文件被编译出来,上面编译出来的是armeabi-v7a
,因为其他的被注释了。所以我是一次注释一个,编译之后把so文件复制出来,然后编译四次就有四个so文件了。
我编译的过程中失败是因为我把APP_PLATFORM=android-8
没有配置好,如果设置成android-8
就失败了,可能是因为我没有这个版本吧,替换成android-9就没有问题了
,这个需要大家自己去实践,找对版本。
在adnroid目录执行命令ndk-build
即可执行编译。
编译好之后的结果如下:
然后怎么移植到自己的项目中呢?我的方法就是把src里面的代码拷贝到项目中,所需的res也同样拷贝,so文件放到项目中的libs中。然后在build.gradle
中配置如下:
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
设置so文件的加载路径即可。
至于更细节的问题就不说了,本文最主要的是得到编译的so文件。
使用上面的步骤得到的so文件的的包名是com.artifex.mupdfdemo
,因为src里面的类是的包名就是这个。如果我们想要改变这个包名,当然有人这么问过我,我就回答不可以,因为我不会,早知道回答我不会了(%>_<%)。既然编译了源码,那么这个问题也就应该解决一下。
首先来看一下com.artifex.mupdfdemo
这个是在哪出现的。
我们来看一下jni目录下的mupdf.c文件,里面的内容很多,需要看的内容如下:
#define JNI_FN(A) Java_com_artifex_mupdfdemo_ ## A
#define PACKAGENAME "com/artifex/mupdfdemo"
可以看到,包名就是在这里定义的,所以我们在这个把包名改了,如下:
#define JNI_FN(A) Java_com_app_mupdf_ ## A
#define PACKAGENAME "com/app/mupdf"
当然这个随意,根据自己的需要来改,改完之后就可以ndk-build
了,接下来使用类的时候把类的包名也改一下就可以了。
有问题欢迎讨论交流!