Поэтому я построил этот проект на основе PDF-ридера (MuPDF). Я использовал ndk-build для этого. Название этого проекта — ChoosePDFActivity. Я знаю, что он был правильно построен, потому что я вижу .so файл внутри моего LIBS / armrabi-v7a / THISISTHEFILE.so.
У меня вопрос, как правильно сделать этот проект библиотечным проектом и запустить его из другого проекта?
Я попытался пометить его как библиотечный проект и добавить его в путь сборки моего основного проекта, но я получаю
Обратите внимание, что я использую Mupdf-1.5 (последний в настоящее время)
ExpressionInitializerError, не удалось загрузить библиотеку, FindLibrary
Возвращено NUll ошибок
так что мне делать?
имя моей библиотеки — libmupdf.
Обратите внимание, я новичок в Android-ndk. В моем основном проекте нет папки jni, только в проекте библиотеки.
Это полная ошибка.
06-16 17: 51: 27.680: E / AndroidRuntime (5673): ИСКЛЮЧИТЕЛЬНОЕ ИСКЛЮЧЕНИЕ: основное
06-16 17: 51: 27.680: E / AndroidRuntime (5673):
java.lang.ExceptionInInitializerError 06-16 17: 51: 27.680:
E / AndroidRuntime (5673): на java.lang.Class.newInstanceImpl (собственный
Метод) 06-16 17: 51: 27.680: E / AndroidRuntime (5673): в
java.lang.Class.newInstance (Class.java:1319) 06-16 17: 51: 27.680:
E / AndroidRuntime (5673): в
android.app.Instrumentation.newActivity (Instrumentation.java:1025)
06-16 17: 51: 27.680: E / AndroidRuntime (5673): в
android.app.ActivityThread.performLaunchActivity (ActivityThread.java:1871)
06-16 17: 51: 27.680: E / AndroidRuntime (5673): в
android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:1981)
06-16 17: 51: 27.680: E / AndroidRuntime (5673): в
android.app.ActivityThread.access $ 600 (ActivityThread.java:123) 06-16
17: 51: 27.680: E / AndroidRuntime (5673): в
android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1147)
06-16 17: 51: 27.680: E / AndroidRuntime (5673): в
android.os.Handler.dispatchMessage (Handler.java:99) 06-16
17: 51: 27.680: E / AndroidRuntime (5673): в
android.os.Looper.loop (Looper.java:137) 06-16 17: 51: 27.680:
E / AndroidRuntime (5673): в
android.app.ActivityThread.main (ActivityThread.java:4424) 06-16
17: 51: 27.680: E / AndroidRuntime (5673): в
java.lang.reflect.Method.invokeNative (родной метод) 06-16
17: 51: 27.680: E / AndroidRuntime (5673): в
java.lang.reflect.Method.invoke (Method.java:511) 06-16 17: 51: 27.680:
E / AndroidRuntime (5673): в
com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:825)
06-16 17: 51: 27.680: E / AndroidRuntime (5673): в
com.android.internal.os.ZygoteInit.main (ZygoteInit.java:592) 06-16
17: 51: 27.680: E / AndroidRuntime (5673): в
dalvik.system.NativeStart.main (собственный метод) 06-16 17: 51: 27.680:
E / AndroidRuntime (5673): вызвано: java.lang.UnsatisfiedLinkError:
Не удалось загрузить libmupdf: findLibrary вернул null 06-16 17: 51: 27.680:
E / AndroidRuntime (5673): в
java.lang.Runtime.loadLibrary (Runtime.java:365) 06-16 17: 51: 27.680:
E / AndroidRuntime (5673): в
java.lang.System.loadLibrary (System.java:535) 06-16 17: 51: 27.680:
E / AndroidRuntime (5673): в
com.mainpackage.MainActivity. (MainActivity.java:44)
Пожалуйста, помогите мне, это убивает меня на пару дней. Заранее спасибо.
это мой Android.mk:
LOCAL_PATH := $(call my-dir)
TOP_LOCAL_PATH := $(LOCAL_PATH)
MUPDF_ROOT := ../..
ifdef NDK_PROFILER
include android-ndk-profiler.mk
endif
include $(TOP_LOCAL_PATH)/Core.mk
include $(TOP_LOCAL_PATH)/ThirdParty.mk
include $(CLEAR_VARS)
LOCAL_C_INCLUDES := \
jni/andprof \
$(MUPDF_ROOT)/include \
$(MUPDF_ROOT)/source/fitz \
$(MUPDF_ROOT)/source/pdf
LOCAL_CFLAGS :=
LOCAL_MODULE := mupdf
LOCAL_SRC_FILES := mupdf.c
LOCAL_STATIC_LIBRARIES := mupdfcore mupdfthirdparty
ifdef NDK_PROFILER
LOCAL_CFLAGS += -pg -DNDK_PROFILER
LOCAL_STATIC_LIBRARIES += andprof
else
endif
LOCAL_LDLIBS := -lm -llog -ljnigraphics
ifdef SSL_BUILD
LOCAL_LDLIBS += -L$(MUPDF_ROOT)/thirdparty/openssl/android -lcrypto -lssl
endif
include $(BUILD_SHARED_LIBRARY)
Вот снимок моих проектов. Есть два выделенных проекта, о которых мы говорим, а ChoosePDFActivity — это проект библиотеки.
,
Хорошо, просто что-то вроде этого будет работать для моего случая:
Возможно ли иметь весь проект в моей окончательной сборке? Мне просто нужно передать ОДНО намерение из моего основного проекта, а все остальное будет обработано ChoosePdf … проект.
Постскриптум
Я заметил, что есть только armeabi-v7a. Итак, есть ли способ собрать mupdf для других архитектур?
РЕДАКТИРОВАТЬ
Для тех, кто хочет иметь рендеринг PDF в Android, Android L (наконец-то) получил API, чтобы сделать возможным рендеринг в PDF.
Вам просто нужно создать фиктивную динамическую библиотеку, которая просто ссылается на вашу статическую библиотеку, например:
https://stackoverflow.com/a/2957386/892714
Система сборки ndk (к сожалению) не будет создавать статическую библиотеку без ее использования динамической библиотекой. Затем вы просто берете свою статическую библиотеку из obj / local / armeabi-v7a.
Вам не нужно никакого волшебства NDK, потому что если ваш проект не имеет jni/
папку, и если вы поместите библиотеки в libs/
они будут там. (На всякий случай поставьте их под контроль версий; по умолчанию .so обычно игнорируется.)
Самая важная строка в вашем журнале:
Caused by: java.lang.UnsatisfiedLinkError: Couldn't load libmupdf
Если ваш проект использует две библиотеки, вы должны загрузить обе в порядке, разрешающем зависимости.
static {
System.loadLibrary("tools"); // libtools.so
System.loadLibrary("main"); // libmain.so
}
Как я понимаю, у вас нет проблем с компоновщиком, но на всякий случай я публикую эти ссылки:
Re: Как построить разделяемую библиотеку и вызвать ее в другой программе ndk
Android NDK — создайте две собственные разделяемые библиотеки, вызывающие друг друга
Android NDK: ссылка с использованием предварительно скомпилированной статической библиотеки