2012-04-28 26 views
5

Tôi phải sử dụng hai thư viện gốc: một là thư viện của riêng tôi và thư viện kia là bên thứ ba. Miễn là tôi sử dụng chúng trong các dự án riêng biệt, mọi thứ đều ổn. Nhưng bây giờ tôi đang nhận được Exception Ljava/lang/UnsatisfiedLinkError.nhiều thư viện gốc (của tôi và bên thứ ba) trong Android NDK

Tôi đang sử dụng Eclipse.

Tôi phát hiện ra rằng nếu tôi đặt thư viện hiện có trong libs/armeabi, Eclipse bắt đầu biên dịch mã gốc và không thành công. Nếu tôi xây dựng lại phần JNI từ dòng lệnh, việc biên dịch thành công nhưng thư viện của bên thứ ba biến mất. Thực sự ngu ngốc.

Vậy làm thế nào để tôi nói với Eclipse sử dụng thư viện hiện có .so cùng với thư viện phải được xây dựng? Các thư viện độc lập.

Trả lời

7

NDK cho phép liên kết với các thư viện người dùng dựng sẵn, sử dụng biến PREBUILT_SHARED_LIBRARY.

Giả sử rằng các thư viện bạn cần liên kết là librandom.so, tạo một thư mục libs trong jni thư mục con của thư mục dự án:

mkdir -p jni/libs 
cp librandom.so jni/libs 

Sau đó, chỉ cần tạo một file jni/libs/Android.mk:

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 
LOCAL_MODULE := random 
LOCAL_SRC_FILES := librandom.so 
include $(PREBUILT_SHARED_LIBRARY) 

Bạn có thể tạo một phần cho mỗi thư viện dựng sẵn, tất cả được đặt trong jni/libs.

Tiếp theo, bạn chỉ cần bao gồm tệp ở trên vào jni/Android.mk của mình để làm mọi thứ hoạt động. Trong các tài liệu NDK, nó được khuyến khích rằng đây được thực hiện ở phần cuối của các Android.mk, chứ không phải giữa:

include $(LOCAL_PATH)/libs/Android.mk 

Tuy nhiên, bạn sẽ cần phải làm điều này trước khi các mô-đun mà đòi hỏi thư viện này.

Để liên kết, bạn cần thêm phần sau vào phần mô-đun liên kết đến thư viện dựng sẵn.

LOCAL_SHARED_LIBRARIES := random 

Sau đó, khi bạn tạo ndk, nó sẽ sao chép thư viện này vào libs/armeabi/ trước khi tạo mô-đun và bạn tốt để đi.

Lưu ý: Điều này không giải quyết được vấn đề với tiêu đề bắt buộc. Bạn vẫn sẽ cần thêm vị trí của tiêu đề cho thư viện vào biến LOCAL_C_INCLUDES trong mô-đun yêu cầu nó.

+0

CẬP NHẬT: nếu một thư viện phụ thuộc vào một thư viện khác, hãy xem http://stackoverflow.com/questions/17688327/android-ndk-make-two-native-shared-libraries-calling-each-other – 18446744073709551615

3

Đây là những gì tôi đã làm cho thời điểm này. Tôi sẽ không chấp nhận (trong ý nghĩa stackoverflow) của riêng tôi (này) câu trả lời beause nó là không đạt yêu cầu.

Tôi đã tạo một dự án mới và sao chép tất cả các tệp java tại đó. Sau đó, tôi đã sao chép thư viện .so từ dự án cũ và thư viện của bên thứ 3 vào libs/armeabi.

Thật quái dị. Nhưng nó đã có tác dụng. Cho thời điểm này. Điều tồi tệ nhất là việc kiểm soát phiên bản là ngư lôi.