2013-03-29 106 views
0

我正在嘗試在Mono中爲Android應用程序呈現PDF文檔。我在C中使用MuPdf庫wiritten,並且在調用一個C函數時遇到問題。我能得到什麼:Mono for Android和MuPdf PInvoke

System.EntryPointNotFoundException: fz_pixmap_samples 

C函數:

unsigned char *fz_pixmap_samples(fz_context *ctx, fz_pixmap *pix) 
{ 
    if (!pix) 
     return NULL; 
    return pix->samples; 
} 

我的C#包裝:

public class APV 
{ 
    [DllImport("libmupdf.so", EntryPoint = "fz_pixmap_samples", CallingConvention = CallingConvention.Cdecl)] 
    private static extern IntPtr fz_pixmap_samples(IntPtr ctx, IntPtr pix); 

    public static IntPtr GetSamples(IntPtr ctx, IntPtr pix) 
    { 
     return fz_pixmap_samples(ctx, pix); 
    } 
} 

我打電話GetSamples方式:

APV.GetSamples(context, pix); 

功能fz_pixmap_samples( fz_context * ctx,fz_pixmap * pix)應該是r控制我指向位圖數據的指針。我假設映射無符號char *到IntPtr是不正確的?誰能幫忙?

回答

0

System.EntryPointNotFoundException:fz_pixmap_samples

意味着該庫不輸出一個名爲fz_pixmap_samples功能。很可能有一些名稱裝飾,意味着該功能以不同的名稱導出。

要做的第一件事是刪除EntryPoint參數,它將允許託管代碼查找裝飾名稱。

如果這樣做沒有完成,那麼您需要研究.so庫文件以準確找出用於導出函數的名稱。並在你的p/invoke聲明中使用它。

+0

你說得對,「nm -D」表示.so庫不包含fz_pixmap_samples。問題解決了。 – szysz3kster

0

我知道這是舊的,但對於那些希望我們解決了它的:

fz_pixmap_samples在1.8版本中,我們使用的.so文件中實際上並沒有暴露(出口)。如果你運行nm,你會看到它不會被導出。這就是爲什麼試圖使用它時出現運行時錯誤的原因。

因此,我們不得不去muPDF網站,獲取項目和來源,並進行更改並重新編譯它。我知道,這是一個痛苦。似乎是唯一的答案。

不得不去source/platform/android/jni文件夾中的muPDF.c,並在那裏調用fz_pixmap_samples(NULL, NULL)內有一個具有jni導出調用的方法。只要在那裏調用fz_pixmap_samples(NULL, NULL),就可以在重新編譯它時將它暴露在.so文件中。

要重新編譯muPDF,請按照mupdf項目中提供的說明進行重新編譯。他們是很好的指示。