森.林木

Windows环境下为Android编译MuPDF1.13

1、环境准备

1、Android SDK:配置为环境变量
2、Android NDK:配置为环境变量
3、CygWin:这个东西安装的时候,要特别地把make组件选上,默认是不安装的。
展开Devel
enter description here

在里面找到make,然后,Bin 和 Src 如果可以勾选都 勾选上,点击下一步就可以安装了
enter description here

2、MuPDF源码下载

1
git clone --recursive git://git.ghostscript.com/mupdf-android-viewer.git

上面的指令会下载MuPDF的一个Android示例和MuPDF源码,示例无法直接运行,需要编译MuPDF后,才能生成.so文件。

可以通过以下指令,单独获取MuPDF源码和Jni代码

1
git clone --recursive git://git.ghostscript.com/mupdf.git

详情,可参考:
1、https://mupdf.com/docs/android-sdk.html
2、https://mupdf.com/

3、配置设置

(1)在工程的根目录下创建 local.properties 文件,配置 Android SDK 和 NDK 的路径:

1
2
3
4
5
6
7
8
9
10
11
12
13
## This file is automatically generated by Android Studio.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file must *NOT* be checked into Version Control Systems,
# as it contains information specific to your local configuration.
#
# Location of the SDK. This is only used by Gradle.
# For customization when using a Version Control System, please read the
# header note.
#Tue Jun 05 19:57:20 CST 2018

sdk.dir=/home/hanpfei0306/data/dev_tools/Android/Sdk
ndk.dir=/home/hanpfei0306/data/dev_tools/Android/android-ndk-r12b

(2)启动CygWin,在libmupdf 目录下执行 make generate 命令生成必要的文件:

1
$ make generate

4、编译

启动CMD,执行以下指令

1
ndk-build APP_BUILD_SCRIPT=libmupdf/platform/java/Android.mk  APP_PROJECT_DIR=build/android  APP_PLATFORM=android-16 APP_OPTIM=release APP_ABI=armeabi-v7a NDK_ALL_ABIS=armeabi-v7a  NDK_DEBUG=0  -j4 APP_SHORT_COMMANDS=true LOCAL_SHORT_COMMANDS=true -B -n

APP_SHORT_COMMANDS=true LOCAL_SHORT_COMMANDS=true 这两个参数是为了解决CmdLine内容过多,Windows参数限制问题。参考:https://stackoverflow.com/questions/12598933/ndk-build-createprocess-make-e-87-the-parameter-is-incorrect

以上指令,也可以配置在Application.mk文件中

编译有可能失败,可更换APP_SHORT_COMMANDS=true LOCAL_SHORT_COMMANDS=true这两个参数的值,再编译,即可成功。

5、总结

(1)这里没有整合Gradle来编译,因为Gradle的默认参数,会导致编译失败,需要特殊配置。大致如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
task ndkBuild(type: Exec, description: 'Compile JNI source via NDK') {
commandLine 'C:\\Users\\xhrong\\AppData\\Local\\Android\\sdk\\ndk-bundle\\ndk-build.cmd',//这里本地ndk的路径
'NDK_LIBS_OUT=libs',
'APP_BUILD_SCRIPT=libmupdf/platform/java/Android.mk',
'APP_ABI=armeabi-v7a',
'APP_PLATFORM=android-16',
'APP_SHORT_COMMANDS=true',
'LOCAL_SHORT_COMMANDS=false'

}
tasks.withType(JavaCompile){
compileTask->compileTask.dependsOn ndkBuild
}

(2)整体上无法直接成功,需要修改参数多次编译。比较麻烦。