簡體   English   中英

將MuPDF集成為庫項目(Android)

[英]Integrating MuPDF as a library project (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):致命異常:主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。 app.ActivityThread.performLaunchActivity(ActivityThread.java:1871)06-16 17:51:27.680:E / AndroidRuntime(5673):at 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):at android.os.Handler.dispatchMessage(H andler.java:99)06-16 17:51:27.680:E/AndroidRuntime(5673):atroid.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):at java.lang.reflect.Method.invokeNative(Native Method)06- 16 17:51:27.680:E / AndroidRuntime(5673):at 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):在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渲染成為可能的api。

您只需創建一個虛擬動態庫,只需鏈接您的靜態庫,如下所示:

https://stackoverflow.com/a/2957386/892714

ndk構建系統(遺憾的是)在沒有動態庫使用的情況下不會創建靜態庫。 然后你只需從obj / local / armeabi-v7a中獲取靜態庫。

你真的不需要任何NDK魔法,因為如果你的項目沒有jni/文件夾,如果你把庫放在libs/ ,它們就會在那里。 (以防萬一,將它們置於版本控制之下;默認情況下。通常會被忽略。)

您日志中最重要的一行是:

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:使用預編譯的靜態庫鏈接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM