2015-06-27 77 views
0

我已經開始使用renderscript,並想知道爲什麼它在支持模式下無法使用api 16。例如,在項目https://github.com/harism/android_reimage代碼:android.support.v8.renderscript.RSRuntimeException:加載ScriptC腳本失敗

scriptInvert = new ScriptC_invert(rs); 

我趕上例外:

造成的:android.support.v8.renderscript.RSRuntimeException:ScriptC腳本加載失敗。 在android.support.v8.renderscript.ScriptC。(ScriptC.java:69)

在io.github.harism.lib.reimage.ScriptC_invert。(ScriptC_invert.java:42)

在IO。 github.harism.lib.reimage.ScriptC_invert。(ScriptC_invert.java:34)

在io.github.harism.lib.reimage.ReImage。(ReImage.java:56)

在io.github。 harism.lib.reimage.ReImage.from(ReImage.java:45)

有人知道爲什麼會發生這種情況?的.RS碼

例失敗(https://github.com/harism/android_reimage/blob/master/reimage/src/main/rs/invert.rs):

#pragma version(1) 
#pragma rs java_package_name(io.github.harism.lib.reimage) 
#pragma rs_fp_relaxed 

void invert(uchar4 *inout, uint32_t x, uint32_t y) { 
    inout->r = 0xFF - inout->r; 
    inout->g = 0xFF - inout->g; 
    inout->b = 0xFF - inout->b; 
} 
+0

您可以請包括.rs源代碼嗎? –

回答

0

這很有趣,但我發現了一個問題的核心......我的.rs文件在庫模塊中。這導致了一個問題,因爲ScriptC中的internalCreate(rs,resources,resourceID)返回0(無法找到原始.bc文件)。

0

重命名RS功能要root,如果你想它可以自動拾取爲核心的腳本。或者,將其更改爲:

void __attribute__((kernel)) invert(uchar4 *inout, uint32_t x, uint32_t y) 

由於您未指定明確的輸出分配,您可能還會遇到問題。使用第二種形式,將void返回值替換爲uchar4,並確保在您的java代碼中設置輸出分配。

+1

如果他們使用內核屬性,他們必須從指針語法轉換(即他們需要一個明確的輸入,然後需要返回0xFF - 相關的輸入通道。他們需要一個臨時變量來做到這一點,但它會看起來清潔劑 –

+0

謝謝,斯蒂芬!我忘記了從指針語法切換。魔鬼在細節中,對吧?! –

0

我認爲這裏的問題可能是proguard剝離代碼。你能嘗試禁用proguard和/或更新它不刪除任何有關RS支持庫(或您的自定義代碼)?

+0

我在調試模式下測試,其中proguard被禁用。 – BobroAlexandr

+0

您可以添加logcat的更多行嗎?可能會解釋腳本加載失敗的原因.Java異常本身似乎沒有太多細節。 –