2015-01-26 19 views
9

Tôi đang tạo một ứng dụng trong Android Studio sử dụng hai thư viện. Thư viện gốc có trình bao bọc Android và thư viện jar. Vì lý do nào đó, thư viện gốc sẽ không tải nếu thư viện jar khác được biên dịch vào dự án. Vì vậy, nếu tôi chạy ứng dụng chỉ với thư viện gốc, mọi thứ đều hoạt động tốt. Tôi thêm khác jar-thư viện để gradle-file của tôi và sự bùng nổ ... một UnsatisfiedLinkError:Android studio: UnsatisfiedLinkError: findLibrary trả về null - đang tải thư viện gốc

java.lang.UnsatisfiedLinkError: Couldn't load MobileOcrEngine from loader dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.example.app-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.example.app-1, /vendor/lib, /system/lib]]]: findLibrary returned null 

Ứng dụng của tôi chạy tốt khi tôi sử dụng này:

dependencies { 
    compile fileTree(include: ['*.jar'], dir: 'src/main/jniLibs') 
    compile 'com.android.support:support-v13:21.0.2' 
    compile project(':wheel') 
} 

Lỗi này xảy ra khi tôi cố gắng:

dependencies { 
    compile fileTree(include: ['*.jar'], dir: 'src/main/jniLibs') 
    compile 'com.android.support:support-v13:21.0.2' 
    compile project(':wheel') 
    compile files('libs/realm-0.78.0.jar') 
} 

hoặc khi tôi cố gắng sử dụng các thư viện tương tự nhưng sử dụng kho Maven:

dependencies { 
    compile fileTree(include: ['*.jar'], dir: 'src/main/jniLibs') 
    compile 'com.android.support:support-v13:21.0.2' 
    compile project(':wheel') 
    compile 'io.realm:realm-android:0.78.0' 
} 

hoặc nếu tôi cố gắng đặt jar trong thư mục jniLibs:

dependencies { 
    compile fileTree(include: ['*.jar'], dir: 'src/main/jniLibs') 
    compile 'com.android.support:support-v13:21.0.2' 
    compile project(':wheel') 
} 

Tôi không có ý tưởng nơi gốc rễ của vấn đề nằm. Với một trong hai thư viện, Android Studio hoặc tôi đang làm điều gì đó sai?

Lưu ý: Tôi biết đã có nhiều câu hỏi về StackOverflow về UnsatisfiedLinkErrors, nhưng không ai trong số những cung cấp các giải pháp cho vấn đề của tôi. Tôi không gặp sự cố khi tải thư viện gốc nếu đó là thư viện duy nhất tôi sử dụng ...

Trả lời

15

Tôi đã tìm thấy sự cố. Các lọ khác tôi muốn thêm sử dụng trong nội bộ một thư viện C + + với sự hỗ trợ cho armeabi, armeabi-v7a, x86mips. Thư viện gốc tôi đã sử dụng tất cả thời gian này chỉ được hỗ trợ armeabi.

Thiết bị tôi đang sử dụng để thử nghiệm là thiết bị armeabi-v7a. Tất cả thời gian này khi tôi đang sử dụng thư viện gốc, thiết bị đã kiểm tra thư viện trong armeabi-v7a của thư mục libs của tôi. Nếu nó không thể tìm thấy nó ở đó, nó sẽ thử thư mục armeabi.

Khi tôi nạp bình khác có hỗ trợ cho 4 kiến ​​trúc khác nhau, thiết bị sẽ tải thư viện armeabi-v7a. Vì nó tìm thấy một thư viện armeabi-v7a cho jar, nó sẽ cố gắng tải thư viện riêng cho cùng một kiến ​​trúc. Nếu thư viện không được tìm thấy, nó sẽ không kiểm tra thư mục armeabi như một bản sao lưu, do đó, findLibrary trả về null, do đó UnsatisfiedLinkError.

Tôi đã giải quyết nó bằng cách tạo một thư mục cho kiến ​​trúc armeabi và sao chép thư viện .so-thư mục armeabi-v7a vào đó.

+0

Bạn có thể giải thích cách thực hiện giải pháp của mình –

+4

Trong thư mục jniLibs của bạn, có thư mục con cho cả armeabi và armeabi-v7a. Sao chép thư viện của bạn để nó xuất hiện trong cả hai thư mục kiến ​​trúc (armeabi và armeabi-v7a). – Skywalker10

+0

Tuyệt vời ..! Làm việc cho tôi .. Cảm ơn rất nhiều .. –

0
defaultConfig { 
    ... 

    ndk { 
     abiFilters "armeabi-v7a", "x86", "armeabi", "mips" 
    } 

} 
+3

Bạn có thể cung cấp ngay cả những lời giải thích nhỏ nhất về lý do tại sao một người nào đó nên sao chép mã này vào ứng dụng của họ? –

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