Heim >Backend-Entwicklung >C++ >Kann ich LOCAL_SRC_FILES innerhalb des ndk {} DSL in Android Gradle definieren?

Kann ich LOCAL_SRC_FILES innerhalb des ndk {} DSL in Android Gradle definieren?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-10 21:19:14249Durchsuche

Can I Define LOCAL_SRC_FILES within the ndk {} DSL in Android Gradle?

Ist es möglich, LOCAL_SRC_FILES in ndk {} DSL zu definieren?

Möglicherweise müssen Sie LOCAL_SRC_FILES innerhalb des ndk {} DSL-Blocks in Ihrem gradle.build definieren Datei, wenn Sie mit Android Studio-Projekten arbeiten, die nativen Code enthalten. Obwohl dies von aktuellen Gradle-Plugins nicht nativ unterstützt wird, gibt es mehrere Ansätze, um eine ähnliche Funktionalität zu erreichen.

Verwendung eines älteren Ansatzes

In früheren Versionen von Gradle konnten Sie dieses Problem beheben, indem Sie unerwünschte Elemente ausschließen Quelldateien aus dem Build-Prozess. Dieser Ansatz erforderte jedoch das Deaktivieren der regulären NDK-Build-Aufgaben und die Definition benutzerdefinierter Aufgaben.

Verwendung des experimentellen Plugins

Mit der Einführung des experimentellen Plugins von Gradle (com.android.tools.build:gradle- experimentell:0.4.0) können Sie jetzt Dateien basierend auf Mustern vom NDK-Build ausschließen. Verwenden Sie dazu die folgende Syntax:

android.sources {
    main {
        jni.source {
            srcDirs = ["~/srcs/jni"]
            exclude "**/win.cpp"
        }
    }
}

Dadurch können Sie bestimmte Dateien ausschließen, z. B. solche, die für andere Plattformen (z. B. iOS, WinRT) gedacht sind, während Sie in Ihrem NDK-Build auf Android abzielen.

Problemumgehung für das Debuggen

Wenn Sie ein debuggbares Setup benötigen, besteht eine Problemumgehung darin, eine statische Bibliothek mit ndk-build und Verknüpfung zu erstellen Bestücken Sie es mit den notwendigen Gegenständen, um die erforderlichen Symbole bereitzustellen. Dieser Ansatz erfordert die Aufteilung Ihrer nativen Quellen in plattformspezifische und plattformunabhängige Dateien.

In Ihrer build.gradle-Datei:

task buildStaticLib(type: Exec, description: 'Compile Static lib via NDK') {
    commandLine "$ndkBuild", "$staticLibPath", "NDK_PROJECT_PATH=~/srcs", "NDK_OUT=$ndkOut", "APP_ABI=$appAbi", "APP_STL=gnustl_static"
}

tasks.all {
    task ->
        if (task.name.startsWith('link')) {
            task.dependsOn buildStaticLib
        }
}

model {
    android.ndk {
        moduleName = "hello-jni"
        abiFilters += "$appAbi".toString()
        ldFlags += "$staticLib".toString()
        ldLibs += "log"
        cppFlags += "-std=c++11"
    }

    android.sources {
        main.jni.source {
            srcDirs = ["~/srcs/jni"]
        }
}
}

In ~/srcs/Android.mk:

LOCAL_PATH := $(call my-dir)/..

include $(CLEAR_VARS)

LOCAL_MODULE    := staticLib
LOCAL_SRC_FILES := HelloJni.cpp

LOCAL_CPPFLAGS += -std=c++11

include $(BUILD_STATIC_LIBRARY)

Alternativer Ansatz

Alternativ können Sie die Verwendung eines externen Tools wie CMake oder Buck zur Verwaltung in Betracht ziehen Erstellen Sie Ihren nativen Code-Erstellungsprozess und integrieren Sie ihn in Gradle. Dieser Ansatz bietet mehr Flexibilität und Kontrolle über den Kompilierungs- und Verknüpfungsprozess.

Das obige ist der detaillierte Inhalt vonKann ich LOCAL_SRC_FILES innerhalb des ndk {} DSL in Android Gradle definieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn