10

我刚刚在我的 Mac 上从 mupdf.com 编译完 mupdf。花了一些时间才弄明白,但现在我的 libs/armeabi 文件夹中有一个 libmupdf.so。

他们提供了一个名为 MuPDFCore.java 的此类示例,可在此处查看:http: //mupdf.com/repos/mupdf/android/src/com/artifex/mupdf/MuPDFCore.java

我在我的项目中使用了这个类,它在 LogCat 中说明了以下内容:

试图加载 lib /data/data/com.myapp.android/lib/libmupdf.so 0x4070e050

添加了共享库 /data/data/com.myapp.android/lib/libmupdf.so 0x4070e050

在 /data/data/com.myapp.android/lib/libmupdf.so 0x4070e050 中找不到 JNI_OnLoad,跳过初始化

未找到本机 Lcom/myapp/android/viewer/MuPDFCore;.openFile (Ljava/lang/String;)I 的实现

调试/AndroidRuntime(27523):关闭 VM

WARN/dalvikvm(27523): threadid=1: 线程以未捕获的异常退出 (group=0x400ee760)

错误/AndroidRuntime(27523):致命异常:主要

错误/AndroidRuntime(27523): java.lang.UnsatisfiedLinkError: openFile

据我所知,该库正在加载,在我弄清楚如何编译该库之前,它一直在崩溃并说“mupdf”是一个空链接。

他们的例子几乎说 openFile 是一个本机函数......就在我认为我想通了另一个问题的时候。我整天都在努力。任何输入都会很棒!

是不是编译不好?我在终端中没有收到任何错误。

4

3 回答 3

10

当您尝试在您的项目中使用示例项目的 so 文件时,它会抛出“UnsatisfiedLinkError: Native method not found”异常。原因是由于 jni 绑定系统,您的应用程序包名称与示例应用程序包名称(“com.artifex.mupdf”)不同。您可以通过以下方法解决此问题:

1)很长的路要走:根据你的包名更改mudef lib源代码,从中生成二进制文件(.so文件)然后在你的项目中使用它,就像@KuoCH说的那样

2)捷径:在你的根源目录(项目源文件夹旁边,“src/main/java”)中创建“com.artifex.mupdf”包,将示例项目中的所有类复制到其中

于 2014-04-22T08:09:06.990 回答
5

在 mupdf.c L18-19 文件中:

#define JNI_FN(A) Java_com_artifex_mupdfdemo_ ## A 
#define PACKAGENAME "com/artifex/mupdfdemo"

将两者都更改为您的包名称。

于 2013-08-17T15:52:41.023 回答
1

I think you didn't change the your function names in mupdf.c to your corresponding java package name, that means, you should change the function Java_com_artifex_mupdf_MuPDFCore_openFile in your mupdf.c to Java_com_myapp_android_viewer_openFile.

于 2011-08-12T05:34:24.993 回答