正如我在上一篇文章(Compiling renderscript code at runtime)中提到的那样,我尝试在运行时编译renderscript代码。
正如Kietz建议的那样,我需要更改所有生成的Java类都派生自的ScriptC类。
制作自己的扩展Script的类失败,因为我无法调用此超类的构造函数。
此代码段
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的源代码以及其他Android版本都可以在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)
。