正如我在上一篇文章(Compiling renderscript code at runtime)中提到的,我尝试在运行时编译renderscript代码。 正如Kietz所建议的,我需要改变所有生成的java类派生的ScriptC类。 使我自己的扩展脚本的类失败,因为我无法调用此超类的构造函数。
这段代码
public class RuntimeScriptC extends Script {
private static final String TAG = "RuntimeScriptC";
protected RuntimeScriptC(int id, RenderScript rs) {
super(id, rs);
}
给了我这个错误:
The constructor Script(int, RenderScript) is undefined
我的下一个想法是将我自己的类添加到renderscript源代码并将其编译为create 一个新的.jar。我在git上找到了源代码,但不知道如何只构建renderscript包。
编辑:
我刚刚发现Script.java
的构造函数是包私有的。这就是为什么我无法访问自己班级中的构造函数的原因。如果我可以自己编译renderscript源代码,我可以将自己的类放入包中并访问它。
新问题:我在哪里可以找到renderscript来源以及如何编译它们?
答案 0 :(得分:3)
RenderScript的源代码可以在android.googlesource.com找到,也可以在Android的其他部分找到。如果您想重建Android或其中的一部分,here可能是一个很好的起点。
但是,这太过分了。如果您无法直接修改ScriptC
,只需继承它即可。这是可能的,因为ScriptC
所需的唯一方法是其受保护的构造函数。例如,我写了HackedScriptC
,除了将其参数转发给ScriptC()
:
package com.example.android.rs.extremehax;
import android.content.res.Resources;
import android.renderscript.RenderScript;
import android.renderscript.ScriptC;
public class HackedScriptC extends ScriptC {
public HackedScriptC(RenderScript rs, Resources resources, int id) {
// simple passthru to the only constructor that ScriptC_mono uses
super(rs, resources, id);
}
}
现在可以在胶水类中替换ScriptC
:
package com.example.android.rs.extremehax;
// ...
public class ScriptC_mono extends HackedScriptC {
// otherwise identical glue class...
在您的情况下,您不会调用超级构造函数ScriptC(RenderScript,Resources,int)
,因为它会调用您要覆盖的internalCreate
。相反,请调用ScriptC(int,RenderScript)
。