2014-03-27 133 views
1

正如我在之前的文章(Compiling renderscript code at runtime)中提到的,我尝试在运行时编译renderscript代码。 正如Kietz所建议的,我需要改变所有生成的java类派生的ScriptC类。 使我自己的类扩展脚本失败,因为我无法调用这个超类的构造函数。编译renderscript源代码

代码

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源代码和编译它来创建 新。罐。我在git上找到了源代码,但不知道如何构建renderscript包。

编辑: 我刚刚发现的Script.java构造是包专用。这就是为什么我无法在自己的类中访问构造函数的原因。如果我可以自己编译renderscript资源,我可以将我自己的类放入包中并访问它。

新问题:我在哪里可以找到renderscript源代码,以及如何编译它们?

回答

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)

+0

谢谢你这个美好的回答! (再次!)。 – DeGoosseZ

+0

你的帮助完成了这个把戏,谢谢! – DeGoosseZ

+0

你最终是否重建RenderScript? – Kietz