Frage Wie kann man die * .so-Bibliothek in Android Studio integrieren?


Ich habe viele Threads gelesen, wie man eine * .so Bibliothek zu Android Studio hinzufügt, aber keiner von ihnen funktioniert, besonders wenn es um den Textpunkt geht: Das funktioniert nicht mit dem neueren xxx (Android Studio, grandle, ...)

Können wir bitte einen Neuanfang machen? Ich habe:

Android Studio 0.6.0

Aus der Projektstruktur sehe ich:

SDK-Standort:

/usr/share/android-studio/data/sdk
/usr/lib/jvm/default-java

Projekt:

Gradle version 1.10
Android Plugin Version 0.11.+

Module / App: Eigenschaften:

Kompiliere Sdk Version 19 Build Tools Version 19.1.0

Abhängigkeiten:

{dir=libs, include=[*.jar]} Compile

{dir=libs, include=[*.so]}  Provided

m com.android.support: appcompat -v7:19.+   Compile

Ich habe die * .so-Dateien vorkompiliert und in der Demo-App arbeiten sie. Ich muss den Quellcode der App ändern, also muss ich mit den gleichen * .so-Dateien neu erstellen.


74
2018-06-23 02:27


Ursprung


Antworten:


Aktuelle Lösung

Erstellen Sie den Ordner project/app/src/main/jniLibsund dann lege deine *.so Dateien in ihren ABI-Ordnern an diesem Ort. Z.B.,

project/
├──libs/
|  └── *.jar       <-- if your library has jar files, they go here
├──src/
   └── main/
       ├── AndroidManifest.xml
       ├── java/
       └── jniLibs/ 
           ├── arm64-v8a/                       <-- ARM 64bit
           │   └── yourlib.so
           ├── armeabi-v7a/                     <-- ARM 32bit
           │   └── yourlib.so
           └── x86/                             <-- Intel 32bit
               └── yourlib.so

Veraltete Lösung

Fügen Sie beide Code-Snippets in Ihrer Modul-Datei "gradle.build" als Abhängigkeit hinzu:

compile fileTree(dir: "$buildDir/native-libs", include: 'native-libs.jar')

So erstellen Sie dieses benutzerdefinierte JAR:

task nativeLibsToJar(type: Jar, description: 'create a jar archive of the native libs') {
    destinationDir file("$buildDir/native-libs")
    baseName 'native-libs'
    from fileTree(dir: 'libs', include: '**/*.so')
    into 'lib/'
}

tasks.withType(JavaCompile) {
    compileTask -> compileTask.dependsOn(nativeLibsToJar)
}

Die gleiche Antwort kann auch in verwandten Fragen gefunden werden: Include .so Bibliothek in apk in Android Studio


46
2018-06-23 07:15



Hinzufügen der .so-Bibliothek in Android Studio 1.0.2

  1. Erstellen Sie Ordner "jniLibs" in "src / main /"
  2. Setzen Sie all Ihre .so-Bibliotheken in den Ordner "src / main / jniLibs"
  3. Ordnerstruktur sieht aus,
    | --app:
    | - | --src:
    | - | - | --main
    | - | - | - | --jniLibs
    | - | - | - | - | --Armeabi
    | - | - | - | - | - | -. Dateien
    | - | - | - | - | --x86
    | - | - | - | - | - | -. Dateien
  4. Kein zusätzlicher Code erfordert nur das Synchronisieren Ihres Projekts und das Ausführen Ihrer Anwendung.

    Referenz
    https://github.com/commonsguy/sqlcipher-gradle/tree/master/src/main

192
2018-02-10 11:18



* .so Bibliothek in Android Studio

Sie müssen den jniLibs-Ordner innerhalb von android Studio-Projekten erstellen und alle .so-Dateien in den Ordner legen. Sie können diese Zeile auch in build.gradle integrieren

compile fileTree (dir: 'libs', include: ['.Krug','.damit'])

Es funktioniert perfekt

| --app:

| - | --src:

| - | - | --main

| - | - | - | --jniLibs

| - | - | - | - | --Armeabi

| - | - | - | - | - | -. Dateien

Dies ist die Projektstruktur.


21
2017-08-27 07:24



Lösung 1: Erstellen eines JniLibs-Ordners

Erstellen Sie einen Ordner namens "jniLibs" in Ihrer App und die Ordner, die Ihr * .so enthalten. Der Ordner "jniLibs" muss im selben Ordner wie die Ordner "Java" oder "Assets" erstellt werden.

Lösung 2: Änderung der build.gradle-Datei

Wenn Sie keinen neuen Ordner erstellen und Ihre * .so-Dateien im libs-Ordner behalten möchten, ist das möglich!

In diesem Fall fügen Sie einfach Ihre * .so-Dateien in den libs-Ordner ein (beachten Sie dabei dieselbe Architektur wie die Lösung 1: libs / armeabi / .so zum Beispiel) und ändern Sie die Build.gradle-Datei Ihrer App, um das Quellverzeichnis hinzuzufügen der JniLibs.

sourceSets {
    main {
        jniLibs.srcDirs = ["libs"]
    }
}

Sie werden mehr Erklärungen haben, mit Screenshots, die Ihnen hier helfen (Schritt 6):

http://blog.guillaumeagis.eu/setup-andengine-mit-android-studio/

BEARBEITEN Es musste jniLibs.srcDirs sein, nicht jni.srcDirs - der Code wurde bearbeitet. Das Verzeichnis kann ein [relativer] Pfad sein, der außerhalb des Projektverzeichnisses liegt.


17
2018-03-24 14:07



Dies ist meine build.gradle Datei, Bitte beachten Sie die Zeile

jniLibs.srcDirs = ['libs']

Dies beinhaltet die * .so-Datei von libs in apk.

sourceSets {
    main {
        manifest.srcFile 'AndroidManifest.xml'
        java.srcDirs = ['src']
        resources.srcDirs = ['src']
        aidl.srcDirs = ['src']
        renderscript.srcDirs = ['src']
        res.srcDirs = ['res']
        assets.srcDirs = ['assets']
        jniLibs.srcDirs = ['libs']
    }

    // Move the tests to tests/java, tests/res, etc...
    instrumentTest.setRoot('tests')

    // Move the build types to build-types/<type>
    // For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...
    // This moves them out of them default location under src/<type>/... which would
    // conflict with src/ being used by the main source set.
    // Adding new build types or product flavors should be accompanied
    // by a similar customization.
    debug.setRoot('build-types/debug')
    release.setRoot('build-types/release')
}

12
2017-12-10 04:03



So verwenden Sie die native-Bibliothek (also Dateien) Sie müssen einige Codes in der Datei "build.gradle" hinzufügen.

Dieser Code dient zum Löschen des "armeabi" -Verzeichnisses und zum Kopieren von "so" -Dateien in "armeabi", während "Projekt bereinigen".

task copyJniLibs(type: Copy) {
    from 'libs/armeabi'
    into 'src/main/jniLibs/armeabi'
}
tasks.withType(JavaCompile) {
    compileTask -> compileTask.dependsOn(copyJniLibs)
}
clean.dependsOn 'cleanCopyJniLibs'

Ich wurde von unten verwiesen. https://gist.github.com/pocmo/6461138


2
2018-03-04 07:57



Android NDK offiziell hello-libs CMake Beispiel

https://github.com/googlesamples/android-ndk/tree/840858984e1bb8a7fab37c1b7c571efbe7d6eb75/hello-libs

Ich habe gerade für Ubuntu 17.10 Host, Android Studio 3, Android SDK 26 gearbeitet, daher empfehle ich dringend, dass Sie Ihr Projekt darauf aufbauen.

Die gemeinsam genutzte Bibliothek wird aufgerufen libgperf, die wichtigsten Code-Teile sind:

  • hallo-libs / app / src / main / cpp / CMakeLists.txt:

    // -L
    add_library(lib_gperf SHARED IMPORTED)
    set_target_properties(lib_gperf PROPERTIES IMPORTED_LOCATION
              ${distribution_DIR}/gperf/lib/${ANDROID_ABI}/libgperf.so)
    
    // -I
    target_include_directories(hello-libs PRIVATE
                               ${distribution_DIR}/gperf/include)
    // -lgperf
    target_link_libraries(hello-libs
                          lib_gperf)
    
  • app / build.gradle:

    android {
        sourceSets {
            main {
                // let gradle pack the shared library into apk
                jniLibs.srcDirs = ['../distribution/gperf/lib']
    

    Dann, wenn du nach unten schaust /data/app auf dem Gerät, libgperf.so wird auch da sein.

  • Verwenden Sie für C ++ - Code: #include <gperf.h>

  • Kopfposition: hello-libs/distribution/gperf/include/gperf.h

  • Standort der Lib: distribution/gperf/lib/arm64-v8a/libgperf.so

  • Wenn Sie nur einige Architekturen unterstützen, lesen Sie: Gradle Build NDK Ziel nur ARM

Das Beispiel git verfolgt die vorgefertigten Shared Libraries, enthält aber auch das Build-System, um sie auch zu erstellen: https://github.com/googlesamples/android-ndk/tree/840858984e1bb8a7fab37c1b7c571efbe7d6eb75/hello-libs/gen-libs


1
2017-11-30 10:56



Ich habe ein ähnliches Problem mit externen nativen Lib-Abhängigkeiten gelöst, die in JAR-Dateien gepackt sind. Manchmal sind diese architekturabhängigen Bibliotheken in einem Jar zusammengefasst, manchmal sind sie in mehrere Jar-Dateien aufgeteilt. Also habe ich ein Buildskript geschrieben, um die Jar-Abhängigkeiten für native libs zu scannen und sie in die richtigen android lib-Ordner zu sortieren. Zusätzlich bietet dies auch die Möglichkeit, Abhängigkeiten herunterzuladen, die nicht in maven repos zu finden sind, was derzeit nützlich ist, um JNA auf Android zu bringen, da nicht alle nativen jars in öffentlichen maven repos veröffentlicht werden.

android {
    compileSdkVersion 23
    buildToolsVersion '24.0.0'

    lintOptions {
        abortOnError false
    }


    defaultConfig {
        applicationId "myappid"
        minSdkVersion 17
        targetSdkVersion 23
        versionCode 1
        versionName "1.0.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    sourceSets {
        main {
            jniLibs.srcDirs = ["src/main/jniLibs", "$buildDir/native-libs"]
        }
    }
}

def urlFile = { url, name ->
    File file = new File("$buildDir/download/${name}.jar")
    file.parentFile.mkdirs()
    if (!file.exists()) {
        new URL(url).withInputStream { downloadStream ->
            file.withOutputStream { fileOut ->
                fileOut << downloadStream
            }
        }
    }
    files(file.absolutePath)
}
dependencies {
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.3.0'
    compile 'com.android.support:design:23.3.0'
    compile 'net.java.dev.jna:jna:4.2.0'
    compile urlFile('https://github.com/java-native-access/jna/blob/4.2.2/lib/native/android-arm.jar?raw=true', 'jna-android-arm')
    compile urlFile('https://github.com/java-native-access/jna/blob/4.2.2/lib/native/android-armv7.jar?raw=true', 'jna-android-armv7')
    compile urlFile('https://github.com/java-native-access/jna/blob/4.2.2/lib/native/android-aarch64.jar?raw=true', 'jna-android-aarch64')
    compile urlFile('https://github.com/java-native-access/jna/blob/4.2.2/lib/native/android-x86.jar?raw=true', 'jna-android-x86')
    compile urlFile('https://github.com/java-native-access/jna/blob/4.2.2/lib/native/android-x86-64.jar?raw=true', 'jna-android-x86_64')
    compile urlFile('https://github.com/java-native-access/jna/blob/4.2.2/lib/native/android-mips.jar?raw=true', 'jna-android-mips')
    compile urlFile('https://github.com/java-native-access/jna/blob/4.2.2/lib/native/android-mips64.jar?raw=true', 'jna-android-mips64')
}
def safeCopy = { src, dst ->
    File fdst = new File(dst)
    fdst.parentFile.mkdirs()
    fdst.bytes = new File(src).bytes

}

def archFromName = { name ->
    switch (name) {
        case ~/.*android-(x86-64|x86_64|amd64).*/:
            return "x86_64"
        case ~/.*android-(i386|i686|x86).*/:
            return "x86"
        case ~/.*android-(arm64|aarch64).*/:
            return "arm64-v8a"
        case ~/.*android-(armhf|armv7|arm-v7|armeabi-v7).*/:
            return "armeabi-v7a"
        case ~/.*android-(arm).*/:
            return "armeabi"
        case ~/.*android-(mips).*/:
            return "mips"
        case ~/.*android-(mips64).*/:
            return "mips64"
        default:
            return null
    }
}

task extractNatives << {
    project.configurations.compile.each { dep ->
        println "Scanning ${dep.name} for native libs"
        if (!dep.name.endsWith(".jar"))
            return
        zipTree(dep).visit { zDetail ->
            if (!zDetail.name.endsWith(".so"))
                return
            print "\tFound ${zDetail.name}"
            String arch = archFromName(zDetail.toString())
            if(arch != null){
                println " -> $arch"
                safeCopy(zDetail.file.absolutePath,
                        "$buildDir/native-libs/$arch/${zDetail.file.name}")
            } else {
                println " -> No valid arch"
            }
        }
    }
}

preBuild.dependsOn(['extractNatives'])

0
2017-07-04 08:59