Xamarin.android 适用于Android和MuPdf PInvoke的Mono

Xamarin.android 适用于Android和MuPdf PInvoke的Mono,xamarin.android,pinvoke,mupdf,Xamarin.android,Pinvoke,Mupdf,我正在尝试在Mono for Android应用程序中在Android上呈现PDF文档。我使用的是用C编写的MuPdf库,在调用一个C函数时遇到问题。我得到的是: System.EntryPointNotFoundException: fz_pixmap_samples C功能: unsigned char *fz_pixmap_samples(fz_context *ctx, fz_pixmap *pix) { if (!pix) return NULL; r

我正在尝试在Mono for Android应用程序中在Android上呈现PDF文档。我使用的是用C编写的MuPdf库,在调用一个C函数时遇到问题。我得到的是:

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#包装纸:

我调用GetSamples的方式:

APV.GetSamples(context, pix);
函数fz_pixmap_samples(fz_context*ctx,fz_pixmap*pix)应该返回指向位图数据的指针。我假设将unsigned char*映射到IntPtr是不正确的?有人能帮忙吗

System.EntryPointNotFoundException:fz_pixmap_示例

表示库不导出名为
fz\u pixmap\u samples
的函数。很可能存在一些名称修饰,这意味着该函数以不同的名称导出

首先要做的是删除
EntryPoint
参数,该参数将允许托管代码查找修饰名称


如果这还不能完成,那么您需要研究.so库文件,以找出导出函数所使用的确切名称。并在您的p/invoke声明中使用它。

我知道它很旧,但对于那些正在寻找的人,我们通过以下方法解决了它:

fz_pixmap_示例
在.so的1.8版本中没有实际公开(导出)。如果在其上运行nm,您将看到它没有导出。这就是为什么在尝试使用它时会出现运行时错误

因此,我们必须去muPDF网站,获取项目和源代码,并进行更改和重新编译。我知道,这很痛苦。这似乎是唯一的答案

必须转到source/platform/android/jni文件夹中的muPDF.c,并在其中一个具有jni导出调用的方法中调用
fz_pixmap_samples(NULL,NULL)
。只要在那里调用
fz\u pixmap\u samples(NULL,NULL)
,现在就可以在重新编译它时在.so文件中公开它

要重新编译muPDF,请按照针对android重新编译的muPDF项目中提供的说明进行操作。它们是很好的说明。

您是对的,“nm-D”这样说。所以该库不包含fz_pixmap_样本。问题解决了。
APV.GetSamples(context, pix);