使用MuPDF渲染引擎编写AIR Native Extension

时间:2014-04-09 10:31:17

标签: android pdf air air-native-extension mupdf

我正在尝试使用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;


    }

}

1 个答案:

答案 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层。