Моно для Android и MuPdf PInvoke

Я пытаюсь отобразить PDF-документ на Android в приложении Mono для Android. Я использую библиотеку MuPdf, написанную на C, и у меня проблема с вызовом одной функции C. Что я получаю:

System.EntryPointNotFoundException: fz_pixmap_samples

Функция С:

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

Моя оболочка С#:

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) должна вернуть мне указатель на растровые данные. Я предполагаю, что сопоставление unsigned char * с IntPtr неверно? Может ли кто-нибудь помочь?


person szysz3kster    schedule 29.03.2013    source источник


Ответы (2)


System.EntryPointNotFoundException: fz_pixmap_samples

означает, что библиотека не экспортирует функцию с именем fz_pixmap_samples. Скорее всего есть какое-то украшение имени, означающее, что функция экспортируется под другим именем.

Первое, что нужно сделать, это удалить аргумент EntryPoint, который позволит управляемому коду искать оформленные имена.

Если это не поможет, вам нужно изучить файл библиотеки .so, чтобы узнать, какое именно имя используется для экспорта функции. И используйте это в своем объявлении p/invoke.

person David Heffernan    schedule 29.03.2013
comment
Вы правы, nm -D говорит, что библиотека .so не содержит fz_pixmap_samples. Задача решена. - person szysz3kster; 29.03.2013

Я знаю, что это старо, но для тех, кто ищет, мы решили это:

fz_pixmap_samples на самом деле не был представлен (экспортирован) в версии 1.8 файлов .so, которые мы использовали. Если вы запустите на нем nm, вы увидите, что он не экспортируется. Вот почему при попытке его использования возникает ошибка времени выполнения.

Поэтому нам пришлось зайти на сайт muPDF, получить проект и исходный код, внести изменения и перекомпилировать его. Я знаю, это боль. Казалось бы, единственный ответ.

Пришлось перейти к muPDF.c внутри папки source/platform/android/jni и там вызвать fz_pixmap_samples(NULL, NULL) внутри одного из методов, который имеет вызов экспорта jni. Просто вызов fz_pixmap_samples(NULL, NULL) теперь будет отображать его в файле .so при перекомпиляции.

Чтобы перекомпилировать muPDF, следуйте инструкциям, приведенным в проекте mupdf для перекомпиляции для Android. Это хорошие инструкции.

person jesse.net    schedule 03.06.2016