Android:ubuntu下编译MuPDF源码

前言

使用MuPDF也有一段时间了,虽然不是太熟练,但是也能解决一般的问题了。从一开始不能把项目建起来,无法加载so文件,到现在基本都可以解决问题。然后一直的遗憾就是没有自己去编译源码得到so文件,一直都是用别人的so文件,而且还不全,只有armeabi-v7a,缺少armeabi、x86等so文件。所以就下定决心去自己编译源码。这么说总让人认为编译源码很难一样,其实很简单,只是自己一开始就畏惧了罢了。

编译准备

我一直使用的系统都是ubuntu,所以编译也是基于ubuntu的。
首先需要做的就是要配置NDK,NDK的配置并不是很复杂,下载NDK然后放到一个目录,最后配置一下环境就可以了,这些都可以网上搜,所以就不多说了,放一个参考链接吧。

配置完之后在终端测试一下,如图

Android:ubuntu下编译MuPDF源码_第1张图片

如果有这样的效果,说明就没有问题了。

下载源码的方式还是比较多的,这里提供两种:

  • git clone --recursive git://git.ghostscript.com/mupdf.git使用git直接下载最新库。
  • http://www.mupdf.com/downloads/去这里可以下载最新的源码压缩包和之前版本的压缩包。

因为最新的版本1.10和之前的版本1.6生成的so文件大小差很大,所以我使用了1.6的版本,不过编译过程基本没有差别。

下载完源码之后,里面的内容如下所示

Android:ubuntu下编译MuPDF源码_第2张图片

一般情况下是不会出现问题的,网上提醒的就是看看thirdparty是否存在。

开始编译

然后在这个目录打开终端,输入命令make generate就可以得到一个generated文件夹,这样第一步就可以了。

然后进入到platform文件夹,里面有android文件夹,1.10的版本是进入android之后还分为exampleviewer文件夹,需要进入viewer文件夹去执行下一步。不过1.6的版本直接进入android文件夹就可以了,内容如下

Android:ubuntu下编译MuPDF源码_第3张图片

里面有一个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了,接下来使用类的时候把类的包名也改一下就可以了。

有问题欢迎讨论交流!

你可能感兴趣的:(Android)