正如我在上一篇文章(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)

07-24 12:57