gpt4 book ai didi

java - 在运行时编译 renderscript 代码

转载 作者:太空宇宙 更新时间:2023-11-03 10:20:48 25 4
gpt4 key购买 nike

我想知道是否可以在 android 应用程序运行时编写/修改 renderscript 代码。我的主要目标是制作一个应用程序,用户可以在没有任何 Java 知识的情况下学习使用 renderscript。应用程序的基本布局将由输入和输出图像组成,并可能进行代码输入。此应用程序的基本功能已经可用,这是界面图像。 App layout

使用来自应用的直接反馈来测试 renderscript 代码会很有用。

我已经对构建过程进行了研究并提出了以下想法:

一个基本的"template"渲染脚本文件,带有必要的全局变量,如输入和输出分配。

我的 java 代码将创建生成的 java 类的脚本对象,并对这些全局脚本变量进行基本初始化。此模板 .rs 文件的根函数将是空的,并且应该可以由用户在运行时实现。

当用户在应用程序的主视图中键入代码时,代码将写入我自己的 .rs 文件,然后由应用程序调用的 llvm-rs-cc 编译器编译。然后将生成的 .bc 复制到原始 .bc 文件的位置模板。因为代码的唯一更改发生在根函数内部,所以没有必要更改周围的代码java代码。

我目前遇到的问题是 .bc 文件 bundle 在 res/raw 文件夹内的最终 apk 中,该应用程序无法访问。因此不可能用新生成的文件覆盖旧的 .bc 文件。

是否有(另一种)方法在运行时编译 renderscript 代码?

编辑:解决方案可以在这个 github 中找到关联。更多详情,查看this回答,阅读最后一条评论

最佳答案

您必须至少更改生成的粘合类 (ScriptC_mono) 及其基础 (ScriptC)。

<ExtremeHax>

.bc文件被读取并传递给 RenderScript 的内部。据我所知,这是在 ScriptC.internalCreate() 内部完成的,它被连线以读取原始资源。您需要它来代替从您控制的位置读取文件。可能你只需要修改 internalCreate()但可能会出现复杂情况,需要进行更广泛的编辑。

一旦你实现了RuntimeScriptC , 你应该修改 ScriptC_mono从该基类而不是 ScriptC 继承.

如您所述,您可以对 rs 进行的更改非常有限。代码,因为您不能在运行时修改胶水类。例如,您无法更改内核的签名。但是,您可以更进一步地使用此 hack:如果您放弃胶水类,则可以进行任何您想要的更改。

内核在胶水类中通过索引而不是名称调用,类型/元素检查在胶水类内部完成。因此即使你改变了内核的签名,只要你知道它的索引和它的输入和输出分配的类型,你仍然可以通过使用 forEach() 来调用它。直接。

public class ScriptC_mono extends ScriptC {
//...

public void forEach_root(Allocation ain, Allocation aout) {
// check ain
if (!ain.getType().getElement().isCompatible(__U8_4)) {
throw new RSRuntimeException("Type mismatch with U8_4!");
}
// check aout
if (!aout.getType().getElement().isCompatible(__U8_4)) {
throw new RSRuntimeException("Type mismatch with U8_4!");
// Verify dimensions
Type tIn = ain.getType();
Type tOut = aout.getType();
if ((tIn.getCount() != tOut.getCount()) ||
(tIn.getX() != tOut.getX()) ||
(tIn.getY() != tOut.getY()) ||
(tIn.getZ() != tOut.getZ()) ||
(tIn.hasFaces() != tOut.hasFaces()) ||
(tIn.hasMipmaps() != tOut.hasMipmaps())) {
throw new RSRuntimeException("Dimension mismatch between input and output parameters!");
}
forEach(mExportForEachIdx_root, ain, aout, null);
}
}

</ExtremeHax>

关于java - 在运行时编译 renderscript 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22636681/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com