android.support.v8.renderscript.RSRuntimeException: 加载 ScriptC 脚本失败

android.support.v8.renderscript.RSRuntimeException: Loading of ScriptC script failed

我已经开始使用 renderscript 并想知道为什么它在 api 16 支持模式下不起作用。例如在代码项目 https://github.com/harism/android_reimage 中:

scriptInvert = new ScriptC_invert(rs);

我发现了异常:

Caused by: android.support.v8.renderscript.RSRuntimeException: Loading of ScriptC script failed. at android.support.v8.renderscript.ScriptC.(ScriptC.java:69)

at io.github.harism.lib.reimage.ScriptC_invert.(ScriptC_invert.java:42)

at io.github.harism.lib.reimage.ScriptC_invert.(ScriptC_invert.java:34)

at io.github.harism.lib.reimage.ReImage.(ReImage.java:56)

at io.github.harism.lib.reimage.ReImage.from(ReImage.java:45)

有人知道为什么会发生这种情况吗?

失败的 .rs 代码示例 (https://github.com/harism/android_reimage/blob/master/reimage/src/main/rs/invert.rs):

#pragma version(1)
#pragma rs java_package_name(io.github.harism.lib.reimage)
#pragma rs_fp_relaxed

void invert(uchar4 *inout, uint32_t x, uint32_t y) {
    inout->r = 0xFF - inout->r;
    inout->g = 0xFF - inout->g;
    inout->b = 0xFF - inout->b;
}

如果您希望自动将 RS 函数选为脚本的内核,请将其重命名为 root。或者,将其更改为:

void __attribute__((kernel)) invert(uchar4 *inout, uint32_t x, uint32_t y)

您可能还会 运行 遇到问题,因为您没有指定明确的输出分配。对于第二种形式,将 void return 值替换为 uchar4 并确保在 java 代码中设置输出分配。

我认为这里的问题可能是 proguard 剥离了代码。您可以尝试禁用 proguard and/or 更新它以不删除与 RS 支持库(或您的自定义代码)相关的任何内容吗?

这很有趣,但我发现了一个问题的核心...我的 .rs 文件在库模块中。这导致了一个问题,因为 ScriptC 中的 internalCreate(rs, resources, resourceID) 返回了 0(无法找到原始 .bc 文件)。