Android NDK-Multilib Unterstützung mit Gradle

8

Meine Frage bezieht sich auf die native Android-Entwicklung für 64-Bit-Android-Systeme.

Ich bin auf der Suche nach einer Möglichkeit, die Unterstützung von 32-Bit kompilierten nativen Bibliotheken auf einem 64-Bit Android-System zu konfigurieren, das das Gradle-Build-System verwendet. Die Bibliotheken, die die Anwendung verwenden soll, sind nur als 32-Bit-Build verfügbar. Es wäre sehr zeitaufwendig und fehleranfällig, diese Bibliotheken auf 64 Bit zu portieren.

Daher möchte ich grittle konfigurieren, um diese vorgefertigten 32-Bit-Binärdateien zu implementieren und auch eine 32-Bit-Version der Android-Anwendung zu verwenden.

Die aktuelle Konfiguration führt zu folgendem Fehler:

%Vor%

Es scheint, als ob das PathClassLoader in den falschen Verzeichnissen aussieht. Ich habe die angegebene APK-Datei überprüft und es fehlen die Bibliotheken. Es gibt keinen lib Ordner in der apk. Das Build-System schließt nicht die 32-Bit-Bibliotheken ein. Da es für armv7 nur eine Prebuild-Version gibt, befinden sich diese Bibliotheken im Ordner app/src/main/jnilibs .

Ich muss hinzufügen, dass dieses Setup perfekt für jedes 32-Bit-Android-System funktioniert. Ich habe es vorher mit dem Emulator und einem physischen Gerät ausprobiert.

Wie soll man die Multiarch 32 / 64bit Unterstützung mit Gradle aktivieren? Oder wie ist es möglich, eine 32-Bit-Anwendung mit Android Studio / Gradle auf einem 64-Bit-Android-System bereitzustellen?

Ich habe im Internet gesucht und einen Link zum Thema gefunden, aber es bezieht sich auf das ältere Build-System: Ссылка . Ich weiß nicht, wie ich die Beschreibung übernehmen soll.

Ich benutze Android Studio (Build: 141.1989493, 6. Juni 2015). Das project/build.gradle ist unberührt. Die Datei app/build.gradle sieht folgendermaßen aus:

%Vor%     
Matthias Scholz 10.06.2015, 16:09
quelle

2 Antworten

2

Das Konzept von mulilib ist nur für Projekte, die Teil eines Android-Systems sind, und Sie sollten die Option android: multiarch nicht einstellen, da Sie nur 32bit-Bibliotheken haben, da diese Option nur für 32- und 64-Bit-Anwendungen gilt Bibliotheken zu anderen installierten Anwendungen.

64-Bit-Android-Systeme unterstützen 32-Bit-Anwendungen direkt. Sie müssen Ihre App nur so verpacken, dass Ihre .so-Dateien wie bei allen Android-Geräten in lib/(armeabi-v7a,x86,...) der APK enthalten sind.

Zum Installationszeitpunkt werden die Bibliotheken der vom Gerät bevorzugten Architektur installiert. Dh: Wenn es keinen x86_64-Ordner gibt, werden die x86-Bibliotheken installiert. Wenn es keinen arm64-v8a-Ordner gibt, werden die Armea-v7a-Bibliotheken installiert, und Ihre App wird im 32-Bit-Modus ausgeführt.

Wenn Sie nichts unter lib haben, bedeutet das, dass Android Studio Ihre .so-Dateien nicht kennt. Standardmäßig wird nach ihnen in jniLibs/(armeabi-v7a,x86,...) gesucht, daher sollten Sie sie dort platzieren oder sourceSets.main.jniLibs.srcDir in das Verzeichnis Ihrer Wahl ändern.

    
ph0b 12.06.2015 09:21
quelle
1

Um die 32bit-Anwendungsbereitstellung für 64-Bit-Android-Systeme zu erhalten, müssen Sie einen armv7 productFlavor und einen Unterordner im Ordner jniLibs definieren, der die entsprechende Architektur benennt.

Produktgeschmacksdefinition in app/build.gradle :

%Vor%

Native Bibliotheksstruktur:

%Vor%     
Matthias Scholz 11.06.2015 12:07
quelle