将MuPDF作为一个库项目(Android)

所以我建立了基于pdf阅读器(MuPDF)的这个项目。 我使用了ndk-build。 该项目的名称是ChoosePDFActivity。 我知道它已被正确构建,因为我可以在我的libs / armrabi-v7a / THISISTHEFILE.so中看到.so文件。 我的问题是,我如何正确地将该项目制作成一个图书馆项目并从另一个项目中运行它?

我试图将它标记为一个库项目,并将其添加到我的主项目的构建路径中,但我明白了

请注意,我正在使用Mupdf-1.5(最新的一个)

ExpressionInitializerError,无法加载库,FindLibrary返回NUll错误

那么我该怎么做?

我的库的名称是libmupdf。 请注意,我是android-ndk的新手。 我没有任何jni文件夹在我的主项目中,只有在图书馆项目。 这是完整的错误。

06-16 17:51:27.680:E / AndroidRuntime(5673):致命异常:main 06-16 17:51:27.680:E / AndroidRuntime(5673):java.lang.ExceptionInInitializerError 06-16 17:51:27.680: E / AndroidRuntime(5673):at java.lang.Class.newInstanceImpl(Native Method)06-16 17:51:27.680:E / AndroidRuntime(5673):at 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。 E / AndroidRuntime(5673):at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)06-16 17:51:android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)06-16 17:51:27.680: 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):at android.os.Handler.dispatchMessage(H andler.java:99)06-16 17:51:27.680:E / AndroidRuntime(5673):at android.os.Looper.loop(Looper.java:137)06-16 17:51:27.680:E / AndroidRuntime 5673):at android.app.ActivityThread.main(ActivityThread.java:4424)06-16 17:51:27.680:E / AndroidRuntime(5673):at java.lang.reflect.Method.invokeNative(Native Method)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):at com。 android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:825)06-16 17:51:27.680:E / AndroidRuntime(5673):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java :592)06-16 17:51:27.680:E / AndroidRuntime(5673):at dalvik.system.NativeStart.main(Native Method)06-16 17:51:27.680:E / AndroidRuntime(5673):引起: java.lang.UnsatisfiedLinkError:无法加载libmupdf:findLibrary返回null 06-16 17:51:27.680:E / AndroidRuntime(5673):at java.lang.Runtime.loadLibrary(Runtime.java:365)06-16 17 :51:27.680:E / AndroidRuntime (5673):at java.lang.System.loadLibrary(System.java:535)06-16 17:51:27.680:E / AndroidRuntime(5673):at 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 ...项目。

PS我注意到,只有一个armeabi-v7a。 那么,有没有其他方法可以为其他体系结构构建mupdf?

编辑对于那些想要在android中进行PDF渲染的人来说,Android L(最终)已经获得了使本机pdf渲染成为可能的apis。


你只需要创建一个虚拟的动态库,像这样简单地链接到你的静态库:

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:使用预编译的静态库进行链接

链接地址: http://www.djcxy.com/p/21179.html

上一篇: Integrating MuPDF as a library project (Android)

下一篇: How do you view a different branch of your GitHub Pages?