首頁 >後端開發 >C++ >我可以在 Android Gradle 的 ndk {} DSL 中定義 LOCAL_SRC_FILES 嗎?

我可以在 Android Gradle 的 ndk {} DSL 中定義 LOCAL_SRC_FILES 嗎?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-10 21:19:14246瀏覽

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

是否可以在 ndk {} DSL 定義 LOCAL_SRC_FILES?

您可能會遇到需要在 gradle.build 的 ndk {} DSL 區塊中定義 LOCAL_SRC_FILES處理包含本機程式碼的 Android Studio 專案時的檔案。雖然目前的 Gradle 插件本身不支援此功能,但有多種方法可以實現類似的功能。

使用較舊的方法

在 Gradle 的早期版本中,您可以透過排除不需要的方法來解決此問題建置過程中的原始檔案。然而,這種方法需要停用常規 NDK 建置任務並定義自訂任務。

使用實驗性插件

引入Gradle 的實驗性插件(com.android.tools.build:gradle-實驗性:0.4.0),您現在可以根據模式從NDK 構建中排除文件。為此,請使用以下語法:

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

這允許您在 NDK 建置中針對 Android 時排除特定文件,例如用於其他平台(例如 iOS、WinRT)的檔案。

調試解決方法

如果您需要可調試設置,解決方法包括使用 ndk-build 構建靜態庫和將其與必要的對象鏈接以提供所需的符號。這種方法需要將您的原生原始碼拆分為特定於平台和獨立於平台的檔案。

在您的build.gradle 檔案中:

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"]
        }
}
}

在~/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)

替代方法

替代方法或者,您可以考慮使用外部工具,例如CMake 或Buck 來管理您的本機程式碼建置流程並將其與Gradle集成。這種方法為編譯和連結過程提供了更大的靈活性和控制力。

以上是我可以在 Android Gradle 的 ndk {} DSL 中定義 LOCAL_SRC_FILES 嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn