2014-04-09 98 views
0

我正在嘗試使用MuPDF作爲針對Android和iOS的AIR渲染引擎。使用MuPDF渲染引擎編寫AIR本機擴展

爲了達到這個目的,我試着做一個AIRNativeExtension(.ane)。

用於.ane的用例是這樣的:

  • 打開單個頁面的.pdf

  • 渲染的PDF爲位圖的(可能是縮放)部分,並將其傳遞迴空氣。

  • 我不需要與UI完整的PDF閱讀器應用程序和所有花哨多餘的東西像大綱和說明等

所以AR,我成功地簽出,並內置MuPDF Android和編碼所有'膠水'與ActionScript進行交流。 但是,在我的項目中整合MuPDF給我很難。我試圖按照這個線程here,但它有點過時了,很多在那裏描述的類/路徑在最近幾個月顯然發生了變化,很難找到任何有關庫的java端實現的指導

所以我最終導出了一個28兆的大文件,這對我來說有點大,可以使用。所以我必須把它降到最低限度。

現在的問題:

該方法在執行上面扔下我一個例外:

異常Ljava /朗/ 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; 


    } 

} 

回答

3

MuPDF的核心是打開/處理/渲染PDF(和其他格式)文件的C庫。我們還提供了各種示例工具,用於包裝此中央核心庫,以便以有用的方式公開功能。這些工具包括各種示例查看器,如android之一。

這裏關鍵的是MuPDF是一個C庫,而不是一個Java庫。這意味着ndk被用來產生一個共享庫對象(libmupdf.so),這些(相對)簡單的java類可以調用它。

使Java可訪問C庫的技術稱爲'JNI'(Java本地接口)。實際上,通過在java中聲明某些函數爲「本地」,它們實際上會調用從本機代碼編譯的共享庫對象中的條目。

當我們編寫Android查看器時,我們沒有將C API的完整鏡像轉換爲java。相反,我們採取了只是暴露我們需要的零件的捷徑。所有這些代碼都可以在platform/android/jni/mupdf.c文件中看到。這裏的方法對我們簡單的查看器來說已經足夠了,但可能並不適合您的需要。

我們正在研究一個更完整的JNI反射圖層,但這還沒有發佈。請訪問我們的#ghostscript irc頻道,如果它能幫助您,我們可以讓您儘早訪問它。

我懷疑你會發現使用乾淨的JNI界面工作起來要容易得多,而不是那些作爲android查看器一部分的有限界面。

或者,您可以隨時編寫您自己的JNI圖層,僅用於您需要的MuPDF api函數。

+0

感謝您的回答。所以你建議做一個自己的JNI包裝?實際上,包中的接口對於我的用例來說過於複雜,而不是相反;-)另外,我想對libmupdf.so減輕一些壓力,因爲它大約只有8個兆字節,不知道從哪裏開始。任何提示非常受歡迎 –

+0

其中6個megs是PDF呈現所需的數據資源 - 備用字體和編碼表。您可以使用系統字體來修剪此大小(使用提供的掛載來加載系統字體,並且編譯時不使用默認的內置字體)。 – ccxvii