2015-01-26 16 views
9

Ich mache eine App in Android Studio, die zwei Bibliotheken verwendet. Eine native Bibliothek mit einem Android-Wrapper und einer Jar-Bibliothek. Aus irgendeinem Grund wird die systemeigene Bibliothek nicht geladen, wenn die andere JAR-Bibliothek in das Projekt kompiliert wird. Wenn ich also die App nur mit der nativen Bibliothek ausführe, funktioniert alles einwandfrei. Ich füge das andere Glas-Bibliothek meiner gradle-Datei und Boom ... ein UnsatisfiedLinkError:Android Studio: UnbefriedigterLinkError: findLibrary zurückgegeben Null - Laden nativer Bibliothek

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 

Meine app läuft gut, wenn ich diese verwenden:

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

Der Fehler tritt auf, wenn ich versuche:

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') 
} 

oder wenn ich versuche, die gleiche Bibliothek zu verwenden, aber die Maven-Repository:

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' 
} 

oder wenn ich versuche, das Glas in jniLibs Ordner zu platzieren:

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

Ich habe keine Ahnung, wo die Wurzel des Problems liegt. Mit einer der beiden Bibliotheken, Android Studio oder mache ich etwas falsch?

Hinweis: Ich weiß, es habe auf Stackoverflow in Bezug auf UnsatisfiedLinkErrors viele Fragen gewesen, doch keiner von ihnen bieten Lösungen für mein Problem. Ich habe kein Problem beim Laden der nativen Bibliothek, wenn es die einzige Bibliothek ist, die ich verwende ...

Antwort

15

Ich habe das Problem gefunden. Das andere Jar, das ich hinzufügen wollte, verwendet intern eine C++ - Bibliothek mit Unterstützung für armeabi, armeabi-v7a, x86 und . Die native Bibliothek, die ich die ganze Zeit verwendete, unterstützte nur armeabi.

Das Gerät, das ich zum Testen verwende, ist ein armea-v7a-Gerät. Während der ganzen Zeit, als ich die native Bibliothek benutzte, überprüfte das Gerät die Bibliothek im armeabi-v7a meines libs-Verzeichnisses. Wenn es dort nicht gefunden werden konnte, würde es das Armea-Verzeichnis versuchen.

Wenn ich das andere jar mit Unterstützung für 4 verschiedene Architekturen lade, lädt das Gerät die armee-v7a-Bibliothek. Wenn eine arméabi-v7a-Bibliothek für das jar gefunden wurde, wird versucht, die native Bibliothek für dieselbe Architektur zu laden. Wenn die Bibliothek nicht gefunden wurde, wird das armea-Verzeichnis nicht als Sicherung überprüft. Daher gibt findLibrary null zurück, daher die UnsatisfiedLinkError.

Ich löste es, indem ich ein Verzeichnis für die Armeabi-Architektur machte und die .so-Bibliothek des armea-v7a-Verzeichnisses hineinkopierte.

+0

Könnten Sie bitte erklären, wie Sie Ihre Lösung sowohl für armeabi und armeabi-V7A –

+4

In Ihrem jniLibs Verzeichnis, hat ein Unterverzeichnis zu tun. Kopieren Sie Ihre Bibliothek so, dass sie in beiden Architekturverzeichnissen (armeabi und armeabi-v7a) angezeigt wird. – Skywalker10

+0

Großartig ..! Arbeitete für mich .. Vielen Dank .. –

0
defaultConfig { 
    ... 

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

} 
+3

Könnten Sie auch nur die geringste Erklärung liefern, warum jemand diesen Code in ihre Anwendung kopieren sollte? –