Gradle mit Ihrer nativen Bibliothek verknüpfen

Um Ihr natives Bibliotheksprojekt als Gradle-Build-Abhängigkeit hinzuzufügen, müssen Sie um Gradle den Pfad zu deiner CMake- oder ndk-build-Skriptdatei mitzuteilen. Wann? Sie entwickeln Ihre App, Gradle führt CMake oder ndk-build aus und Pakete werden Bibliotheken in Ihre App integrieren. Gradle verwendet auch das Build-Skript, um zu wissen, welche Dateien die Sie in Ihr Android Studio-Projekt laden können, Projekt. Wenn Sie kein Build-Script für Ihre native Quellen, müssen Sie eine CMake-Build-Skript erstellen, bevor Sie fortfahren.

Jedes Modul in Ihrem Android-Projekt kann nur mit genau einem CMake- oder ndk-Build verknüpft werden. Skriptdatei. Wenn Sie beispielsweise Ausgaben von einem mehrere CMake-Projekte erstellen, benötigen Sie eine CMakeLists.txt-Datei als übergeordnetes CMake-Build-Skript, mit dem Sie dann Gradle verknüpfen, und <ph type="x-smartling-placeholder"></ph> weitere CMake-Projekte hinzufügen als des jeweiligen Build-Skripts. Wenn Sie ndk-build verwenden, können Sie weitere Makefiles auf der obersten Ebene Android.mk-Scriptdatei.

Sobald Sie Gradle mit einem nativen Projekt verknüpft haben, aktualisiert Android Studio die Bereich Projekt, in dem Ihre Quelldateien und nativen Bibliotheken angezeigt werden in der Gruppe cpp und Ihre externen Build-Skripts in der Gruppe External Build Files.

Hinweis:Wenn Sie Änderungen an der Gradle-Konfiguration vornehmen, achten Sie darauf, wenden Sie die Änderungen an, indem Sie auf Projekt synchronisieren klicken. in der Symbolleiste. Wenn Sie Änderungen an CMake oder ndk-build vornehmen, nachdem Sie sie bereits mit Gradle verknüpft haben, Android Studio mit Ihren Änderungen durch Auswahl von Build > Verknüpfte C++- Projekte aus.

Du kannst Gradle über die Benutzeroberfläche von Android Studio:

  1. Öffnen Sie den Bereich Project (Projekt) links in der IDE und und wählen Sie die Ansicht Android aus.
  2. Klicken Sie mit der rechten Maustaste auf das Modul, das Sie mit Ihrer nativen Bibliothek verknüpfen möchten, wie das App-Modul und wählen Sie Link C++ Project mit Gradle über das Menü. Es sollte ein Dialogfeld wie das folgende angezeigt werden: wie in Abbildung 4 dargestellt.
  3. Wählen Sie im Drop-down-Menü entweder CMake oder aus. ndk-build.
    1. Wenn Sie CMake auswählen, verwenden Sie das Feld neben Projektpfad zur Angabe des CMakeLists.txt-Skripts für Ihr externes CMake-Projekt.
    2. Wenn Sie ndk-build auswählen, verwenden Sie das Feld neben Projektpfad zum Angeben der Android.mk-Skriptdatei für Ihr externes "ndk-build"-Projekt. Android Studio enthält außerdem die <ph type="x-smartling-placeholder"></ph> Application.mk. -Datei, wenn sie sich im selben Verzeichnis befindet wie Ihr Android.mk-Datei.

    Abbildung 4: Verknüpfen eines externen C++-Projekts mithilfe der Android Studio-Dialogfeld

  4. Klicken Sie auf OK.

Gradle manuell konfigurieren

Wenn Sie Gradle manuell so konfigurieren möchten, dass eine Verknüpfung zu Ihrer nativen Bibliothek hergestellt wird, müssen Sie die externalNativeBuild-Block zu Ihrer Modulebene build.gradle und konfigurieren Sie sie entweder mit der Methode cmake oder ndkBuild-Block:

Cool

android {
  ...
  defaultConfig {...}
  buildTypes {...}

  // Encapsulates your external native build configurations.
  externalNativeBuild {

    // Encapsulates your CMake build configurations.
    cmake {

      // Provides a relative path to your CMake build script.
      path "CMakeLists.txt"
    }
  }
}

Kotlin

android {
  ...
  defaultConfig {...}
  buildTypes {...}

  // Encapsulates your external native build configurations.
  externalNativeBuild {

    // Encapsulates your CMake build configurations.
    cmake {

      // Provides a relative path to your CMake build script.
      path = file("CMakeLists.txt")
    }
  }
}

Hinweis:Wenn Sie Gradle mit einem vorhandenen „ndk-build“ verknüpfen möchten, Projekt erstellen, verwenden Sie die Methode ndkBuild anstelle des cmake-Block und geben Sie einen relativen Pfad zu Ihrer Android.mk-Datei an. Auch Gradle Die Datei Application.mk ist enthalten, falls sie befindet sich im selben Verzeichnis wie die Android.mk-Datei.

Optionale Konfigurationen angeben

Sie können optionale Argumente und Flags für CMake oder ndk-build angeben, indem Sie Konfigurieren eines weiteren externalNativeBuild-Block innerhalb der defaultConfig Block Ihrer Modulebene build.gradle-Datei. Ähnlich wie andere Properties im defaultConfig Block, Sie können diese Eigenschaften für jeden Block überschreiben Produkt-Geschmacksrichtung in Ihrer Build-Konfiguration.

Wenn in Ihrem Projekt "CMake" oder "ndk-build" z. B. mehrere native Bibliotheken und ausführbare Dateien vor, können Sie die Methode targets, um nur eine Teilmenge davon zu erstellen und zu verpacken für einen bestimmten Produktgeschmack. Im folgenden Codebeispiel wird beschrieben, einige der Eigenschaften, die konfiguriert werden können:

Cool

android {
  ...
  defaultConfig {
    ...
    // This block is different from the one you use to link Gradle
    // to your CMake or ndk-build script.
    externalNativeBuild {

      // For ndk-build, instead use the ndkBuild block.
      cmake {

        // Passes optional arguments to CMake.
        arguments "-DANDROID_ARM_NEON=TRUE", "-DANDROID_TOOLCHAIN=clang"

        // Sets a flag to enable format macro constants for the C compiler.
        cFlags "-D__STDC_FORMAT_MACROS"

        // Sets optional flags for the C++ compiler.
        cppFlags "-fexceptions", "-frtti"
      }
    }
  }

  buildTypes {...}

  productFlavors {
    ...
    demo {
      ...
      externalNativeBuild {
        cmake {
          ...
          // Specifies which native libraries or executables to build and package
          // for this product flavor. The following tells Gradle to build only the
          // "native-lib-demo" and "my-executible-demo" outputs from the linked
          // CMake project. If you don't configure this property, Gradle builds all
          // executables and shared object libraries that you define in your CMake
          // (or ndk-build) project. However, by default, Gradle packages only the
          // shared libraries in your app.
          targets "native-lib-demo",
                  // You need to specify this executable and its sources in your CMakeLists.txt
                  // using the add_executable() command. However, building executables from your
                  // native sources is optional, and building native libraries to package into
                  // your app satisfies most project requirements.
                  "my-executible-demo"
        }
      }
    }

    paid {
      ...
      externalNativeBuild {
        cmake {
          ...
          targets "native-lib-paid",
                  "my-executible-paid"
        }
      }
    }
  }

  // Use this block to link Gradle to your CMake or ndk-build script.
  externalNativeBuild {
    cmake {...}
    // or ndkBuild {...}
  }
}

Kotlin

android {
  ...
  defaultConfig {
    ...
    // This block is different from the one you use to link Gradle
    // to your CMake or ndk-build script.
    externalNativeBuild {

      // For ndk-build, instead use the ndkBuild block.
      cmake {

        // Passes optional arguments to CMake.
        arguments += listOf("-DANDROID_ARM_NEON=TRUE", "-DANDROID_TOOLCHAIN=clang")

        // Sets a flag to enable format macro constants for the C compiler.
        cFlags += listOf("-D__STDC_FORMAT_MACROS")

        // Sets optional flags for the C++ compiler.
        cppFlags += listOf("-fexceptions", "-frtti")
      }
    }
  }

  buildTypes {...}

  productFlavors {
    ...
    create("demo") {
      ...
      externalNativeBuild {
        cmake {
          ...
          // Specifies which native libraries or executables to build and package
          // for this product flavor. The following tells Gradle to build only the
          // "native-lib-demo" and "my-executible-demo" outputs from the linked
          // CMake project. If you don't configure this property, Gradle builds all
          // executables and shared object libraries that you define in your CMake
          // (or ndk-build) project. However, by default, Gradle packages only the
          // shared libraries in your app.
          targets += listOf("native-lib-demo",
                  // You need to specify this executable and its sources in your CMakeLists.txt
                  // using the add_executable() command. However, building executables from your
                  // native sources is optional, and building native libraries to package into
                  // your app satisfies most project requirements.
                  "my-executible-demo")
        }
      }
    }

    create("paid") {
      ...
      externalNativeBuild {
        cmake {
          ...
          targets += listOf("native-lib-paid",
                  "my-executible-paid")
        }
      }
    }
  }

  // Use this block to link Gradle to your CMake or ndk-build script.
  externalNativeBuild {
    cmake {...}
    // or ndkBuild {...}
  }
}

Weitere Informationen zum Konfigurieren von Produkt-Geschmacksrichtungen und zum Erstellen von Varianten finden Sie unter Build-Varianten konfigurieren Für Eine Liste der Variablen, die Sie für CMake mit der arguments finden Sie unter CMake-Variablen verwenden.

Vordefinierte native Bibliotheken einbinden

Wenn Sie möchten, dass Gradle vorgefertigte native Bibliotheken verpackt, die in keinem der beiden externen nativen Build hinzufügen, fügen Sie sie dem src/main/jniLibs/ABI hinzu Verzeichnis Ihres Moduls.

Versionen des Android-Gradle-Plug-ins vor Version 4.0, einschließlich CMake IMPORTED-Ziele in Ihrem jniLibs-Verzeichnis, damit sie in Ihr Wenn Sie von einer früheren Version des Plug-ins migrieren, erhalten Sie eine Fehlermeldung wie die folgende:

* What went wrong:
Execution failed for task ':app:mergeDebugNativeLibs'.
> A failure occurred while executing com.android.build.gradle.internal.tasks.Workers$ActionFacade
   > More than one file was found with OS independent path 'lib/x86/libprebuilt.so'

Wenn Sie das Android-Gradle-Plug-in 4.0 verwenden, verschieben Sie alle Bibliotheken, die von IMPORTED Erstellen Sie Ziele aus Ihrem jniLibs-Verzeichnis, um diesen Fehler zu vermeiden.

ABIs angeben

Standardmäßig erstellt Gradle Ihre native Bibliothek in separaten .so-Dateien. für die Binärschnittstellen (ABIs) vom NDK unterstützt und sie alle in Ihre App verpackt. Bei Bedarf Mit Gradle nur bestimmte ABI-Konfigurationen Ihrer nativen Anwendung erstellen und verpacken können Sie sie mithilfe der ndk.abiFilters in der Datei build.gradle auf Modulebene wie unten gezeigt melden:

Cool

android {
  ...
  defaultConfig {
    ...
    externalNativeBuild {
      cmake {...}
      // or ndkBuild {...}
    }

    // Similar to other properties in the defaultConfig block,
    // you can configure the ndk block for each product flavor
    // in your build configuration.
    ndk {
      // Specifies the ABI configurations of your native
      // libraries Gradle should build and package with your app.
      abiFilters 'x86', 'x86_64', 'armeabi', 'armeabi-v7a',
                   'arm64-v8a'
    }
  }
  buildTypes {...}
  externalNativeBuild {...}
}

Kotlin

android {
  ...
  defaultConfig {
    ...
    externalNativeBuild {
      cmake {...}
      // or ndkBuild {...}
    }

    // Similar to other properties in the defaultConfig block,
    // you can configure the ndk block for each product flavor
    // in your build configuration.
    ndk {
      // Specifies the ABI configurations of your native
      // libraries Gradle should build and package with your app.
      abiFilters += listOf("x86", "x86_64", "armeabi", "armeabi-v7a",
                   "arm64-v8a")
    }
  }
  buildTypes {...}
  externalNativeBuild {...}
}

In den meisten Fällen müssen Sie nur abiFilters im Feld ndk-Block, wie oben gezeigt, da Gradle damit angewiesen wird, sowohl den Build und verpacken diese Versionen Ihrer nativen Bibliotheken. Wenn Sie jedoch festlegen, was Gradle erstellen soll, unabhängig davon, was Sie in Ihre App ein, konfigurieren Sie ein weiteres abiFilters-Flag im <ph type="x-smartling-placeholder"></ph> defaultConfig.externalNativeBuild.cmake-Block (oder defaultConfig.externalNativeBuild.ndkBuild-Block). Logo: Gradle erstellt diese ABI-Konfigurationen, packt aber nur diejenigen, die Sie im <ph type="x-smartling-placeholder"></ph> defaultConfig.ndk-Block.

Wir empfehlen, Android App Bundles zur Veröffentlichung zu nutzen, um die Größe Ihrer App, da nur native Bibliotheken mit dem ABI eines Nutzers übereinstimmen. mit dem Download bereitgestellt wird.

Für alte Apps, die mit APKs veröffentlicht werden, die vor August 2021 erstellt wurden: Konfigurieren mehrere APKs basierend auf ABI erstellen, anstatt ein großes APK zu erstellen, Versionen deiner nativen Bibliotheken erstellen, erstellt Gradle für jede ABI ein separates APK. die Sie unterstützen möchten, und bündelt nur die Dateien, die jedes ABI benötigt. Wenn Sie mehrere APKs pro ABI konfigurieren, ohne die abiFilters wie im Codebeispiel oben gezeigt, erstellt Gradle alle unterstützten ABI-Versionen Ihrer nativen Bibliotheken, sondern nur Pakete, die Sie in der Konfiguration für mehrere APKs angegeben haben. Um zu vermeiden, dass native Bibliotheken, die Sie nicht verwenden möchten, sowohl das Flag abiFilters als auch das APK pro ABI Konfiguration.