2014-06-16 20 views
7

Vì vậy, tôi đã xây dựng dự án này dựa trên trình đọc pdf (MuPDF). Tôi đã sử dụng ndk-build cho điều đó. Tên của dự án này là ChoosePDFActivity. Tôi biết rằng nó đã được xây dựng một cách chính xác vì tôi có thể thấy một tệp .so bên trong số libs/armrabi-v7a/THISISTHEFILE.so của tôi. Câu hỏi của tôi là, làm thế nào để tôi thực hiện đúng dự án này một dự án thư viện và chạy nó từ một dự án khác?Tích hợp MuPDF làm dự án thư viện (Android)

Tôi đã cố gắng đánh dấu nó như là một dự án thư viện và thêm nó vào con đường xây dựng dự án chính của tôi, nhưng tôi nhận

Lưu ý rằng tôi đang sử dụng Mupdf-1.5 (mới nhất hiện nay một)

ExpressionInitializerError , could not load library , FindLibrary Returned NUll errors

vì vậy tôi phải làm gì?

tên thư viện của tôi là libmupdf. Lưu ý, tôi mới sử dụng android-ndk. Tôi không có bất kỳ thư mục jni nào trong dự án chính của tôi, chỉ trong dự án thư viện. Đây là lỗi đầy đủ.

06-16 17:51:27.680: E/AndroidRuntime(5673): FATAL EXCEPTION: 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): at android.app.Instrumentation.newActivity(Instrumentation.java:1025) 06-16 17:51:27.680: E/AndroidRuntime(5673): at 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): at android.app.ActivityThread.access$600(ActivityThread.java:123) 06-16 17:51:27.680: E/AndroidRuntime(5673): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147) 06-16 17:51:27.680: E/AndroidRuntime(5673): at android.os.Handler.dispatchMessage(Handler.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): 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): Caused by: java.lang.UnsatisfiedLinkError: Couldn't load libmupdf: findLibrary returned 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)

Xin hãy giúp tôi, nó sẽ giết tôi trong vài ngày. Cảm ơn trước.

đây là Android.mk tôi:

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) 

Đây là một bản chụp của projects.There của tôi là hai nhấn mạnh các dự án, họ là những người đang được nói đến, với ChoosePDFActivity là dự án thư viện. enter image description here, Được rồi, chỉ cần một cái gì đó như thế này sẽ làm việc cho trường hợp của tôi: Có thể có một dự án toàn bộ bên trong xây dựng cuối cùng của tôi? Tôi chỉ cần vượt qua MỘT ý định cho nó từ dự án chính của tôi, và mọi thứ khác sẽ được xử lý bởi dự án ChoosePdf ....

P.S. Tôi nhận thấy rằng chỉ có armeabi-v7a. Vì vậy, có cách nào để xây dựng mupdf cho các kiến ​​trúc khác cũng như

EDIT Đối với những người muốn có bản dựng PDF trong Android, Android L (cuối cùng) cũng có thể thực hiện hiển thị bản pdf.

Trả lời

2

Bạn chỉ cần có để tạo ra một thư viện động giả mà chỉ liên kết chống lại thư viện tĩnh của bạn như thế này:

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

Các ndk xây dựng hệ thống (không may) sẽ không tạo ra một thư viện tĩnh mà không có nó đang được sử dụng bởi một thư viện động. Sau đó, bạn chỉ cần lấy thư viện tĩnh của bạn từ obj/local/armeabi-v7a.

+0

Đó là, trừ khi bạn chỉ muốn sử dụng thư viện động của bạn như vậy. Nếu đúng như vậy, chỉ cần sao chép nó vào /lib/armeabi-v7a/và nó sẽ được đưa vào. Sau đó bạn có thể gọi System.loadLibrary ("THISISTHEFILE"); – JonnyBoy

+0

đã làm như vậy và gặp lỗi này: [2014-06-17 09:13:59 - Marks ++] Lỗi khi tạo lưu trữ cuối cùng: Đã tìm thấy tệp trùng lặp cho APK: lib/armeabi-v7a/libmupdf.so Xuất xứ 1: C : \ Users \ Harsh \ git \ marks \ Marks ++ \ libs \ armeabi-v7a \ libmupdf.so Xuất xứ 2: C: \ muPDFLIB \ mupdf-1.5-source \ platform \ android \ libs \ armeabi-v7a \ libmupdf.so –

+0

vui lòng đăng tệp Android.mk của bạn. – JonnyBoy

1

Bạn không thực sự cần bất kỳ ma thuật NDK nào vì nếu dự án của bạn không có thư mục jni/ và nếu bạn đặt các thư viện trong libs/, chúng sẽ ở đó. (Chỉ trong trường hợp, đặt chúng dưới sự kiểm soát phiên bản, theo mặc định .so thường bị bỏ qua.)

Điểm mấu quan trọng nhất trong nhật ký của bạn là:

Caused by: java.lang.UnsatisfiedLinkError: Couldn't load libmupdf 

Nếu dự án của bạn sử dụng hai thư viện, bạn phải tải cả hai, theo thứ tự mà sẽ giải quyết phụ thuộc.

static { 
    System.loadLibrary("tools"); // libtools.so 
    System.loadLibrary("main"); // libmain.so 
} 

Theo tôi được biết, bạn không có vấn đề mối liên kết, nhưng chỉ trong trường hợp tôi gửi những liên kết này:
Re: How to build an shared library and call it in other ndk program
Android NDK - make two native shared libraries calling each other
Android NDK: Link using a pre-compiled static library

+0

nhé, tôi hoàn toàn mới mẻ với điều này. Didnt thực sự giúp bạn. bạn có ý gì khi đặt các thư viện trong thư mục libs /? có nghĩa là tệp .so? –

+0

Tôi đã thêm một pic của cây dự án của tôi, xin vui lòng xem nó –

+0

"trong libs /" có nghĩa là libs/armeabi-v7a/THISISTHEFILE.so là ok. (Nore rằng bạn có một lỗi đánh máy trong libs/arm * r * abi-v7a/THISISTHEFILE.so) – 18446744073709551615

Các vấn đề liên quan