首页 >后端开发 >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