Ошибка выполнения android mupdf libmupdf.so Не найдена реализация для собственного openFile

Я только что закончил компилировать mupdf с mupdf.com на своем Mac. Потребовалось некоторое время, чтобы понять это, но теперь у меня есть libmupdf.so в моей папке libs/armeabi.

Они предоставляют пример этого класса под названием MuPDFCore.java, который можно просмотреть здесь: http://mupdf.com/repos/mupdf/android/src/com/artifex/mupdf/MuPDFCore.java

Я использовал этот класс в своем проекте, и в LogCat он говорит следующее:

Попытка загрузить lib/data/data/com.myapp.android/lib/libmupdf.so 0x4070e050

Добавлена ​​общая библиотека /data/data/com.myapp.android/lib/libmupdf.so 0x4070e050.

JNI_OnLoad не найден в /data/data/com.myapp.android/lib/libmupdf.so 0x4070e050, пропуск инициализации

Не найдена реализация для собственного Lcom/myapp/android/viewer/MuPDFCore;.openFile (Ljava/lang/String;)I

DEBUG/AndroidRuntime(27523): завершение работы виртуальной машины

WARN/dalvikvm(27523): threadid=1: поток завершается с необработанным исключением (группа=0x400ee760)

ОШИБКА/AndroidRuntime(27523): НЕИСПРАВНОЕ ИСКЛЮЧЕНИЕ: главная

ОШИБКА/AndroidRuntime (27523): java.lang.UnsatisfiedLinkError: openFile

Насколько я знаю, библиотека загружается, прежде чем я понял, как скомпилировать библиотеку, она продолжала падать и говорить, что «mupdf» - это нулевая ссылка.

Их пример в значительной степени говорит о том, что openFile - это нативная функция ... Как только я подумал, что понял это, всплывает другая проблема. Я работал над этим весь день. Любой вклад был бы замечательным!

Это плохая компиляция? Я не получил никаких ошибок в терминале.


person Paul    schedule 10.03.2011    source источник
comment
Ах ха! Я только что понял это. Я посмотрел на mupdf.c и понял, что есть функции с похожими именами, но с таким длинным префиксом. Я понял, что префикс также является именем пакета. Итак, я поместил MPDFCore обратно в пакет com.artifex.mupdf, и он заработал!   -  person Paul    schedule 11.03.2011
comment
Пожалуйста, объясните свое решение, я застрял в этой проблеме уже целый день :(   -  person Salman Khakwani    schedule 01.08.2013


Ответы (3)


когда вы попытаетесь использовать его в своем проекте с примерами файлов so, он выдаст исключение "UnsatisfiedLinkError: собственный метод не найден". Причина в том, что имя вашего пакета приложения отличается от имени пакета примера приложения ("com.artifex.mupdf") из-за системы привязки jni. Вы можете решить эту проблему с помощью следующих подходов:

1) долгий путь: измените исходный код Mudef lib в соответствии с именем вашего пакета, сгенерируйте из него двоичные файлы (файлы .so), а затем используйте его в своем проекте, как сказал @KuoCH

2) короткий путь: создайте пакет «com.artifex.mupdf» в корневом каталоге исходного кода (рядом с исходной папкой проекта, «src/main/java»), скопируйте в него все классы из примера проекта.

person gturedi    schedule 22.04.2014

В файле mupdf.c L18-19:

#define JNI_FN(A) Java_com_artifex_mupdfdemo_ ## A 
#define PACKAGENAME "com/artifex/mupdfdemo"

Измените оба на имя вашего пакета.

person KuoCH    schedule 17.08.2013

Я думаю, что вы не изменили имена своих функций в mupdf.c на соответствующее имя пакета Java, это означает, что вы должны изменить функцию Java_com_artifex_mupdf_MuPDFCore_openFile в вашем mupdf.c на Java_com_myapp_android_viewer_openFile.

person gluttony    schedule 12.08.2011