2013-03-03 12 views
6

Tôi có hai thư viện gốc của bên thứ ba, giả sử libfoo.solibbar.so. Tôi gặp khó khăn khi tải cả hai thư viện này. Tôi đã sao chép chúng vào thư mục libs dưới khung CPU thích hợp (armeabi, mips và x86) cũng như đặt thư mục Native libs theo Cấu trúc dự án> Mô-đun> Android> Cấu trúc để trỏ đến thư mục libs này. Tôi chỉ có thể tải một thư viện nhưng không thể tải một thư viện khác. Nếu tôi cố gắng tải chúng một lần (xóa các thư viện khác), nó chạy tốt. Ngoại lệ mà tôi nhận được là:Cách thêm nhiều tệp thư viện gốc (.so) trong IntelliJ

java.lang.UnsatisfiedLinkError: Couldn't load foo from loader dalvik.system.PathClassLoader 

Tôi nên làm gì để có IntelliJ hoặc Android runtime để tìm cả hai thư viện gốc này?

+2

Bạn tải chúng như thế nào? – bricklore

+0

Bạn có tìm kiếm tệp .APK kết quả để xem những gì được đặt ở đó không? Nó chỉ là một tệp zip - mở nó bằng 7-Zip hoặc bất kỳ trình quản lý tệp zip nào khác và bạn sẽ thấy tất cả các tệp .so ở đó. – SomeCallMeTim

+0

@SomeCallMeTime: Cảm ơn bạn đã dạy tôi cách giới thiệu các libs bên trong một gói ứng dụng. Tôi gặp sự cố với java.lang.UnsatisfiedLinkError: Không tìm thấy triển khai nào cho bản đồ autonavi bản xứ androidInstance. Tôi đang thêm hai thư viện jni của bên thứ ba vào mã của tôi. và thấy rằng một lib hỗ trợ nhiều kiến ​​trúc cpu và một hỗ trợ chỉ armeabi, vì vậy tôi loại bỏ các kiến ​​trúc khác từ một trong đó hỗ trợ nhiều CPU và chỉ đặt các tập tin armeabi trong dự án của tôi và nó đang làm việc tốt ngay bây giờ –

Trả lời

0

Nó hoàn toàn tìm nạp nhiều lib gốc. Chỉ cần sao chép chúng vào thư mục/libs/CPU_ARCH /. Tuy nhiên tất cả các libs cần phải có cùng kiến ​​trúc. Nếu giả sử libfoo.so là armeabi nhưng libbar.so là x86 thì chỉ có một cái sẽ được sao chép (như bản dùng thử của tôi một thời gian trước).

Sau đó, bạn có thể tải nó:

static { 
    //the following 3 are identical 
    //System.load(context.getApplicationInfo().dataDir + "/lib/libfoo.so"); 
    //Runtime.getRuntime().load(context.getApplicationInfo().dataDir + "/lib/libfoo.so"); 
    System.loadLibrary("foo"); 

    System.loadLibrary("bar"); 
} 

Nếu System.loadLibrary() thất bại, sau đó bạn có thể thử tải với đường dẫn đầy đủ bằng System.load() hoặc Runtime.getRuntime() tải()

.