Erstellt von: java.lang.UnsatisfiedLinkError: Bibliothek kann nicht geladen werden

8

Ich schreibe ein Spiel, und ich habe eine große native Bibliothek. Ich versuche, meine native Bibliothek in meine Hauptaktivität wie

zu laden %Vor%

Ich habe diesen Code auf vielen Geräten im Haus getestet, ich bekomme diesen Fehler nicht. aber von meinem veröffentlichten bekomme ich Protokolle mit " verursacht durch: java.lang.UnsatisfiedLinkError: kann Bibliothek nicht laden ". HINWEIS: Dieser Absturz ist nicht universell, nur wenige Leute bekommen diesen Absturz

  • Ist es ein Problem, wo die Bibliothek in die exportierte APK gestellt wird? Ich habe jetzt Bibliothek in /libs/armabi/libmylib.so automatisch durch Eclipse?
  • Ist es etwas mit der Android-Version zu tun? Ich unterstütze Android-Versionen seit 2.3 (API Level 9)
  • oder muss ich die Bibliothek von einem anderen Ort laden?
  • oder fehlt mir etwas sehr Wichtiges
  • Ist das Problem, dass die ganze App auf SDCARD installiert ist?

Weitere Informationen zum Absturz sind: load_segments: 68 konnte kein Segment von mylib.so zuordnen

    
Shri 13.05.2013, 09:55
quelle

1 Antwort

14

Wenn Sie bedenken, dass Ihre App auf den meisten Geräten ordnungsgemäß funktioniert und Ihnen nur manchmal der Fehler angezeigt wird, kann davon ausgegangen werden, dass die Bibliothek im APK korrekt verpackt ist und auch die Größe / der Speicherbedarf akzeptabel ist.

Als solches werde ich der Laune folgen und vorschlagen, dass das Problem mit der Build / Compile-Architektur der Bibliothek ist. Die meisten neueren Android-Geräte verwenden ARM7-Prozessor. Es ist sehr wahrscheinlich, dass Ihre Bibliothek auch mit der ARM7-Architektur kompiliert wird. Einige ältere Geräte, insbesondere solche mit Android 2.3, verwenden ARM6-Prozessor (ich habe ein solches Gerät zum Testen - LG GT540 mit Android 2.3.3), das nicht mit ARM7-Architektur kompatibel ist. Ich habe einen Absturz mit einem Fehler ähnlich dem angegebenen angezeigt ( load_segments: 68 konnte kein Segment aus mylib.so zuordnen), als ich versuchte, eine App für ARM7 auf meinem alten ARM6-Telefon auszuführen.

Es gibt drei Möglichkeiten, dieses Problem zu umgehen:

  1. Kompilieren Sie die Bibliothek gegen beide Architekturen und fügen Sie zwei separate .so-Dateien in die apk ein. Dann bestimmen Sie zur Laufzeit den Prozessortyp und laden Sie den richtigen. Ehrlich gesagt, ich weiß nicht, ob das überhaupt möglich ist.

  2. Erstellen Sie zwei separate apk-Dateien - eine für ARM6 und eine für ARM7 - und verwenden Sie dann Filter im Manifest, um die entsprechende Architektur anzugeben. Sie können beide in Google Play für die gleiche App hochladen - und Filter im Manifest steuern, welche auf welches Gerät heruntergeladen wird.

  3. Unterstützen Sie die ARM7-Architektur nur, indem Sie Geräteanforderungen in Ihrem Manifest angeben. Sie werden einige Kundenpublikum verlieren, aber Sie werden weniger Arbeit für sich selbst haben, wenn Sie die zwei Versionen der App pflegen.

BEARBEITEN: Gemäß der NDK-Dokumentation können mehrere Bibliotheken für verschiedene Architekturen auf einmal erstellt werden. Sie können gezielt steuern, auf welche CPUs Sie ein Targeting durchführen möchten, indem Sie die folgende Zeile in die Datei Application.mk einfügen:

%Vor%

zum Beispiel

%Vor%

Dann erstellt der Build-Prozess verschiedene Versionen der nativen Bibliothek. Diese Versionen müssen in der endgültigen apk im Verzeichnis

abgelegt werden %Vor%

Wo ist der Name der Architektur? Sie laden dann die Bibliothek mit

%Vor%

Alternativ können Sie separate APK-Dateien für jede Architektur erstellen und dann die Multi-APK-Funktionalität bei Google Play verwenden.

Sie finden alle Informationen zum Architektur-Targeting in der Datei CPU-ARCH-ABIS.html file im Unterverzeichnis docs des NDK.

    
Aleks G 13.05.2013 10:20
quelle

Tags und Links