正如我在上一篇文章(在运行时编译renderscript代码)中提到的,我尝试在运行时编译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源代码中,并编译它以创建一个新的.jar。我在git上找到了源代码,但不知道如何只构建renderscript包。
编辑:我刚刚发现Script.java的构造函数是包私有的。这就是为什么我不能访问自己类中的构造函数的原因。如果我能够自己编译renderscript源代码,我就可以将自己的类放入包中并访问它。
新问题:在哪里可以找到renderscript源代码以及如何编译它们?
发布于 2014-03-27 19:51:47
RenderScript的源代码可以在android.googlesource.com以及安卓的其他部分找到。如果你想重建安卓或者它的一部分,这里可能是一个很好的起点。
然而,这太过分了。如果不能直接修改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)。
https://stackoverflow.com/questions/22685162
复制相似问题