如何使用 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
中修复
似乎 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