安卓Mupdf libmupdf.so运行时错误“未找到本地openFile的实现”

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,跳过init

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

DEBUG/AndroidRuntime(27523): 关闭VM

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

ERROR/AndroidRuntime(27523): FATAL EXCEPTION: 主要的

ERROR/AndroidRuntime(27523): java.lang.UnsatisfiedLinkError: openFile

据我所知,库正在加载。在我弄清如何编译库之前,它一直崩溃并显示“mupdf”是一个空链接。
他们的示例基本上表明openFile是一个本地函数...就在我认为我已经理解了这个问题时,又出现了另一个问题。我一整天都在处理它。任何意见都会很好!
这是一个错误的编译吗?我在终端中没有收到任何错误。

啊哈!我终于搞明白了。我看了一下mupdf.c文件,发现有几个同名的函数,但它们都有一个很长的前缀。我意识到这个前缀也是一个包名。所以我把MUPDFCore放回com.artifex.mupdf包中,现在它可以正常工作了! - Paul
请解释一下你的解决方案,我已经被这个问题困扰了整整一天了 :( - Salman Khakwani
3个回答

10

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

1)长途方式:根据您的包名称更改mudef lib源代码,从中生成二进制文件(.so文件),然后像@KuoCH所说的那样在您的项目中使用它

2)短途方式:在您的根源目录(除了项目源文件夹“src/main/java”之外)中创建“com.artifex.mupdf”包,将所有类从示例项目复制到其中


5

在文件mupdf.c L18-19:

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

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


1

我认为你没有将mupdf.c中的函数名称更改为相应的Java包名称,这意味着你应该将mupdf.c中的函数Java_com_artifex_mupdf_MuPDFCore_openFile更改为Java_com_myapp_android_viewer_openFile。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接