引言
现在大部分关于MuPDF的库,都是1.1一下版本;在嵌入到6.0及以上版本时,会出现错误:libmupdf.so: has text relocations
如何查看当前库文件是否有这个问题?
将当前文件传到linux服务器,使用命令:readelf -a ./libmupdf.so | grep TEXTREL;如果没有linux环境,需要安装cygwin(具体参考百度);
如果返回空,说明没有问题,否则使用该文件在6.0以上版本会报错
MuPDF版本,在1.2版本是一个分水岭,1.2一下版本都会有TEXTREL问题,而1.2及以上在定义JNI方法上跟以前有很大的区别;如果需要在项目上嵌入MuPDF,
又该怎样解决以上的问题?(网上很多libmupdf.so 的库文件,1.0~1.9的都有,在这里我想说的是,就算你下载下来,如果项目中不做调整,一样没什么用)
正题
环境:Ubuntu 14.04(无所谓)、Windows, adt-bundle-linux-x86_64-20140702、android-ndk-r10、mupdf-1.6-source、eclipse(adt-bundle)
这里使用的是mupdf 1.6 不需要选择太高版本的,选择一个合适自己的即可
一.编译mupdf库:
1.下载mudpf,选择自己需要的版本,建议选择1.6~1.10之间的版本
2.解压mupdf源文件:
tar -zxvf mupdf-1.6-source.tar.gz
3.进入解压好的文件
cd mupdf-1.6-source/
4.开始编译
make generate
输入命令后,在当前目录下会出现一个generate文件,这一步很重要,后面生成mupdf库需要依赖它
build COPYING include Makethird resources thirdparty
CHANGES docs Makefile platform scripts
CONTRIBUTORS generated Makerules README source
5.打开eclipse,导入在mupdf-1.6-source下platform下的android项目,见下面截图:
6.修改project.properties
将target=android-20 修改为你的sdk版本;我这里有20和23的,也就是Android 4.4W和6.0,先确认好自己的sdk版本,很重要
7.修改local.properties.sample
将问价修改为local.properties;添加sdk路径; 这里是sdk.dir=/cocos2d-x/adt-bundle-linux-x86_64-20140702/sdk/
8.修改jni/Application.mk
APP_PLATFORM 这里写需要嵌入到那个Android版本()
APP_ABI 这里是嵌入的CPU类型(一般是armeabi armeabi-v7a x86 mips)
修改后
APP_PLATFORM=android-6
APP_ABI := armeabi armeabi-v7a
9.使用eclipse打包jni,也就是编译mupdf库,见下图:
配置好以后,点击apply, 点击OK即可;
编译的话可能会花一点时间,中途会出现一些警告,不用管;如果是出现头文件找不到,打开jni.Android,mk 看看 你是否是修改过MUPDF_ROOT;
如果有修改过,就改回来:MUPDF_ROOT := ../..
10.编译完成后,在lib下的armeabi和armeabi-v7a文件夹下会出现libmupdf.so文件,这个就是我们需要的mupdf库
二、将MuPDF嵌入到项目
1.将mupdf库添加在 项目中libs
2.将mupdf-1.6-source中src中com.artifex.mupdfdemo下copy到项目src下(可以直接使用)
3.这样直接放上去会报错,说是在res下面找不到资源(了解过Android都应该知道)
4.将mupdf-1.6-source下res下有报错的内容复制到项目中res目录下相应的位置
5.将所有资源文件依赖解决以后,运行项目测试
6.成功运行
第一部分主要需要注意的是配置文件的配置,以及路径是否正确;第二部分需要注意的是libmupdf.so 在编译的时候默认是com.artifex.mupdfdemo这个包,所以
,在移植mupdf源码时应该将com.artifex.mupdfdemo整个目录移动过来放在项目src下,然后在根据自己的需求做增删;再就是需要注意依赖的资源文件是不是存在,
不存在就去mupdf源码包中copy;如果运行是出现nullPoint,需要引用你当前项目中R.java文件,我们移植过来的时候这些文件就会报错,需要先将res下的依赖解决以后,
eclipse会自动帮我们在gen下的R.java添加我们新增的资源文件ID等