Xamarin.android 适用于Android和MuPdf PInvoke的Mono
我正在尝试在Mono for Android应用程序中在Android上呈现PDF文档。我使用的是用C编写的MuPdf库,在调用一个C函数时遇到问题。我得到的是: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
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);