如何使用 sbt-android 构建带有 RenderScript 文件的 scala android 项目?

How to use sbt-android to build scala android projects with RenderScript files?

似乎 sbt-android 忽略了 RenderScript 文件的存在并且没有生成 ScriptC_xxx java 类 通常由 gradle builds/Android Studio [更新: 这是错误的,请参阅下面的更新说明]。由于这个问题,sbt-android 构建失败,因为要使用我们需要引用生成的脚本 ScriptC_xxx 类,构建时会出现以下错误:

[error] apackage/YYYClass.java:55: cannot find symbol
[error]   symbol:   class ScriptC_xxx
[error]   location: class apackage.YYYClass
[error]         ScriptC_xxx xxxScript = new ScriptC_xxx(rs);

从现有项目(通常由 gradle 编译)生成的 .sbt 文件具有明显必要的 RenderScript 配置,从 build.gradle 文件生成:

rsTargetApi in Android := "18",
rsSupportMode in Android := rsSupportMode.value || true

为了能够使用 sbt-android 编译包含渲染脚本的 android 项目,我缺少什么?

更新: 我意识到脚本的 java 类 正在正确生成,但不知何故 类 使用那些generated 类 找不到它们,所以可能是我的类路径配置有问题。

这是当前的文件结构:

./asubmodule/src/main/rs/xxx.rs (使用包声明 #pragma rs java_package_name(apackage.scripts)

./asubmodle/src/main/java/apackage/YYYClass.java

./asubmodule/target/android/generated/source/android/support/v7/appcompat/R.java

./asubmodule/target/android/generated/source/apackage/scripts/ScriptC_xxx.java

不幸的是,似乎 com.android.builder.core.AndroidBuilder 不再为处理过的渲染脚本源生成 .d 文件。绕过 AndroidBuilder 以在 sbt-android 中使用 com.android.sdklib.build.RenderScriptProcessor 可以恢复确定生成的文件所需的 .d 文件。但这将是 sbt-android.

未来版本的解决方案

要暂时解决您的问题,您可以将以下内容添加到您的 build.sbt 中:

sourceGenerators in Compile += Def.task {
  implicit output = outputLayout.value
  val layout = projectLayout.value
  (layout.generatedSrc ** "ScriptC_*.java").get ++ (layout.generatedSrc ** "*BitCode.java").get
}.taskValue

因为听起来你正在使用 sbt-android-gradle 你可以创建一个新文件 build.sbt 并将上面的内容放入(不要编辑 00-gradle-generated.sbt

更新:这将在下一版本 sbt-android https://github.com/scala-android/sbt-android/commit/ec09a55233aabd50e7df0085b10c567e38b616d3

中修复