You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Gradle如何获取默认资源目录并添加文件?OpenVR原生库自动下载问题

在Gradle中管理资源目录并添加下载的原生库

我来帮你搞定这个问题!首先得明确:Gradle里的默认资源目录取决于你用的插件,咱们分场景说,再结合你的OpenVR下载需求给出具体实现:

先搞清楚默认资源目录

  • 如果你是Kotlin/JVM项目(你的OpenVR端口大概率属于这类),默认资源目录是src/main/resources
  • 如果是Android项目,原生库更适合放在src/main/jniLibs(而非普通资源目录),普通资源目录则是src/main/res或src/main/resources

下面给你两种可行方案,按需选择:

方案1:把下载的库复制到默认资源目录

这种方式会将文件直接同步到源码目录的资源文件夹,适合需要文件持久化在项目里的场景。

你可以先通过Gradle的sourceSets获取默认资源目录路径,再创建一个依赖下载任务的复制任务:

// 示例用Kotlin DSL,Groovy DSL语法只需微调
plugins {
    id("java")
    kotlin("jvm")
    id("de.undercouch.download") version "5.4.0" // 确保已应用下载插件
}

// 获取默认资源目录的绝对路径
val mainResourcesDir = sourceSets.main.get().resources.sourceDirectories.first()

task downloadNatives {
    doLast {
        // 你的现有下载逻辑,这里补充完整示例:
        val dirBin = "https://api.github.com/repos/ValveSoftware/openvr/contents/bin"
        val contentLinux32 = File(buildDir, "directoryContents_linux32.json")
        download {
            src("$dirBin/linux32")
            dest(contentLinux32)
        }

        // 解析JSON后下载具体库文件(示例)
        val nativeLibUrl = "https://github.com/ValveSoftware/openvr/raw/master/bin/linux32/libopenvr_api.so"
        val downloadedLibDir = File(buildDir, "natives/linux32")
        downloadedLibDir.mkdirs()
        download {
            src(nativeLibUrl)
            dest(downloadedLibDir)
            overwrite(true)
        }
    }
}

// 创建复制任务,依赖下载任务确保顺序
task copyNativesToResources(type: Copy) {
    dependsOn(downloadNatives)
    from("$buildDir/natives") // 下载好的库所在目录
    into("$mainResourcesDir/natives") // 资源目录下的子目录,方便归类
    include("**/*.so", "**/*.dll", "**/*.dylib") // 只复制原生库文件
}

// 让编译任务依赖复制任务,确保编译时资源已就绪
tasks.compileKotlin {
    dependsOn(copyNativesToResources)
}

方案2:把下载目录直接设为额外资源目录

这种方式不需要复制文件,让Gradle直接把build目录下的下载文件夹当成资源目录的一部分,适合不想污染源码目录的场景:

plugins {
    id("java")
    kotlin("jvm")
    id("de.undercouch.download") version "5.4.0"
}

task downloadNatives {
    doLast {
        val nativesDir = File(buildDir, "natives")
        nativesDir.mkdirs()
        
        // 下载逻辑示例,将库文件存到build/natives下
        val nativeLibUrl = "https://github.com/ValveSoftware/openvr/raw/master/bin/linux32/libopenvr_api.so"
        download {
            src(nativeLibUrl)
            dest(File(nativesDir, "linux32"))
            overwrite(true)
        }
    }
}

// 配置sourceSets,添加下载目录为资源源目录
sourceSets.main {
    resources {
        srcDir(File(buildDir, "natives"))
        include("**/*.so", "**/*.dll", "**/*.dylib") // 只包含原生库文件
    }
}

// 让资源处理任务依赖下载任务,确保资源目录已准备好
tasks.processResources {
    dependsOn(downloadNatives)
}

额外提醒

  • 如果是Android项目,原生库优先用jniLibs目录,可通过sourceSets.main.jniLibs.srcDirs.add(File(buildDir, "natives"))配置
  • 可以通过执行./gradlew sourceSets命令,查看所有已配置的资源目录,确认是否生效

内容的提问来源于stack exchange,提问作者elect

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:06:38