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.
Benutzeroberfläche von Android Studio verwenden
Du kannst Gradle über die Benutzeroberfläche von Android Studio:
- Öffnen Sie den Bereich Project (Projekt) links in der IDE und und wählen Sie die Ansicht Android aus.
- 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.
- Wählen Sie im Drop-down-Menü entweder CMake oder aus.
ndk-build.
- Wenn Sie CMake auswählen, verwenden Sie das Feld neben
Projektpfad zur Angabe des
CMakeLists.txt
-Skripts für Ihr externes CMake-Projekt. - 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 IhrAndroid.mk
-Datei.
- Wenn Sie CMake auswählen, verwenden Sie das Feld neben
Projektpfad zur Angabe des
- 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.