我正在尝试使用MuPDF作为针对Android和iOS的AIR渲染引擎。
为实现这一目标,我正在尝试制作AIRNativeExtension(.ane)。
.ane的用例是这样的:
打开单页.pdf
将pdf的(可能缩放的)部分渲染为位图并将其传递回AIR。
我不需要一个完整的pdf阅读器应用程序与ui和所有花哨的额外的东西,如大纲和注释等。
所以,我成功地检查并构建了适用于Android的MuPDF并编写了所有“胶水”以与ActionScript进行通信。 但是在我的项目中整合MuPDF让我很难过。我试图遵循这个线程here,但它有点过时,并且在那里描述的许多类/路径在过去几个月中显然发生了变化,很难找到关于库的java端实现的任何指导< / p>
所以我最终导出了mupdf android作为jar,导致了一个28兆的大文件,这对我来说有点大。所以我必须把它减少到最小。
现在问题:
上面的方法在执行时抛出异常:
Exception Ljava / lang / UnsatisfiedLinkError;初始化时抛出 LCOM / ARTIFEX / mupdfdemo / MuPDFCore;
我该如何解决这个问题?或者这根本不是一个坏主意?
是否可以去除MuPDF,所以我只能导入我需要的部分?
以这种方式渲染pdf是否可行?有没有人试过这个呢?
非常感谢!
P.S。我在这里只粘贴了我的代码的一小部分,因为其他东西只是基本的.ane设置,在这里没有具体的内容。此外,我删除了重现错误所不需要的所有内容,因此代码实际上什么也没做。一旦它正在运行,我当然会以开源的方式分享这个项目。
package com.skill.ane.pdfrenderer;
import android.util.Log;
import com.adobe.fre.FREContext;
import com.adobe.fre.FREFunction;
import com.adobe.fre.FREObject;
import com.artifex.mupdfdemo.MuPDFCore;
public class OpenFileFunction implements FREFunction {
public static final String TAG = "OpenFileFunction";
@Override
public FREObject call(FREContext context, FREObject[] args)
{
try
{
String path = args[0].getAsString();
try
{
MuPDFCore core = new MuPDFCore( context.getActivity().getBaseContext() , path);
// do all the magic stuff in here.
}
catch (Exception e)
{
Log.e(TAG, Log.getStackTraceString( e ) );
return null;
}
}
catch(Exception e)
{
Log.e(TAG, Log.getStackTraceString( e ) );
}
return null;
}
}
答案 0 :(得分:3)
MuPDF的核心是用于打开/操作/呈现PDF(和其他格式)文件的C库。我们还提供了各种示例工具来包装此中央核心库,以便以有用的方式公开功能。这些工具包括各种示例查看器,例如android one。
这里的关键是MuPDF是一个C库,而不是Java库。这意味着ndk用于生成(相对)简单的java类可以调用的共享库对象(libmupdf.so)。
使用Java访问C库的技术被称为JNI&#39; (Java Native Interface)。实际上,通过将某些功能声明为“本地”功能。在java中,它们实际上会调用从本机代码编译的共享库对象中的条目。
当我们编写Android查看器时,我们没有将C API完全镜像到java中。相反,我们采取了公开我们需要的零件的捷径。所有这些代码都可以在platform / android / jni / mupdf.c文件中看到。这里的方法对于我们简单的观察者来说已经足够了,但可能并不适合您的需要。
我们正在开发更全面的JNI反射层,但目前还没有发布。请访问我们的#ghostscript irc频道,如果有帮助,我们可以让您尽早访问它。
我怀疑你会发现使用干净的JNI界面更容易,而不是那些作为android浏览器的一部分的有限的界面。
或者,您可以随时为您需要的MuPDF api函数编写自己的JNI层。