2014-03-27 140 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