【问题标题】:How to use sbt-android to build scala android projects with RenderScript files?如何使用 sbt-android 使用 RenderScript 文件构建 scala android 项目?
【发布时间】:2016-08-06 00:38:08
【问题描述】:

似乎 sbt-android 忽略了 RenderScript 文件的存在,并且没有生成通常由 gradle builds/Android Studio 生成的 ScriptC_xxx java 类 [更新: 这是错误的,se下面的更新说明]。由于这个问题,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 类正在正确生成,但不知何故使用这些生成的类的类找不到它们,所以也许我有一个类路径配置问题。

这是当前文件结构:

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

./asubmodel/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

【问题讨论】:

  • 查看sbt-android source,所有生成的.java 文件都被识别,因为它们列在旧的.d RenderScript 依赖文件(example) 中。但是,这种文件不一定会生成(而且,可能在最新的 RenderScript 版本中甚至不再生成)。你能检查一下你的构建路径中是否存在这样的文件吗?
  • @cmaster11 我确实检查了“find . -name *.d”,似乎没有生成 .d 文件。你的意思是它可能是 sbt-android 中的一个错误?
  • 没错。可能构建工具在最新版本中发生了变化,.d 文件生成过程被彻底清除,或者只是有充分的理由不再使用。
  • 你的渲染脚本源在 src/main/rs 中是否符合预期?
  • @pfn 是的。但我刚刚意识到,似乎正在生成脚本的 java 类,但不知何故使用它们的类找不到它们。也许我错过了 sbt-android 的某种类路径配置?

标签: android scala renderscript sbt-android-plugin sbt-android


【解决方案1】:

不幸的是,com.android.builder.core.AndroidBuilder 似乎不再为处理的渲染脚本源生成.d 文件。绕过AndroidBuildersbt-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-androidhttps://github.com/scala-android/sbt-android/commit/ec09a55233aabd50e7df0085b10c567e38b616d3的下一版本中修复

【讨论】:

  • 好的,我是 sbt 的新手,所以我可能错过了一些东西。我用你的代码创建了一个新的 build.sbt 文件,但它抱怨一些语法。我想出了以下 build.sbt,它仍然给我找不到脚本类错误。这是你想到的 build.sbt 吗? androidBuild platformTarget in Android := "android-23" sourceGenerators in Compile += Def.task {implicit val output = outputLayout.value val layout = projectLayout.value (layout.generatedSrc ** "ScriptC_*.java").get ++ (layout.generatedSrc ** "*BitCode.java").get }.taskValu
  • 什么?您是否从 gradle 导入?如果是,那么您在 build.sbt 中的所有内容就是我所说的。
  • 我的意思是,如果你的代码就是我在 build.sbt 文件中的全部代码,它会报错: $ sbt app/android:run [info] Loading global plugins from /x/x/. sbt/0.13/plugins [info] 从 /x/x/workspace/y/project 加载项目定义加载缓存的 gradle 项目定义 [错误] [/x/x/workspace/y/build.sbt]:2: '=> ' 预期但 '=' 找到。项目加载失败:(r)etry、(q)uit、(l)ast 还是 (i)gnore?
  • 如果您想获得支持,请使用 gitter。 stackoverflow 令人沮丧。
  • 我应该!谢谢!会做
猜你喜欢
  • 2013-05-24
  • 2017-05-30
  • 2011-09-15
  • 2018-01-13
  • 2015-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-28
相关资源
最近更新 更多