2016-12-27 4 views
0

Ich versuche, eine App mit Android-Renscript zu schreiben, fehlgeschlagen Rand Teilerkennung Teil einer Funktion zu schreiben. Beobachtet, dass es funktioniert perfekt, wenn das Gerät Android-Version ist weniger als oder gleich Lolipop sondern auch in anderen Geräten ist es die meiste Zeit (variiert von Build ohne Abhängigkeit von Änderungen am Code zu bauen, wie ich beobachtet) gibt SIGSEV 11 oder SIGBUS 7 Fehler mit Adressfehler.Android Renderscript Adresse Fehler

Dies ist implementierungsDetektions rs Kante:

uchar4 __attribute__((kernel)) Edge2(uchar in,uint32_t x, uint32_t y) { 
//sobel 
uint32_t n = max(y - 1, (uint32_t)0); 
uint32_t s = min(y + 1, (uint32_t)height); 
uint32_t e = min(x + 1, (uint32_t)width); 
uint32_t w = max(x - 1, (uint32_t)0); 
const uchar *e11 = rsGetElementAt(gIn, w, n); 
const uchar *e21 = rsGetElementAt(gIn, x, n); 
const uchar *e31 = rsGetElementAt(gIn, e, n); 

const uchar *e12 = rsGetElementAt(gIn, w, y); 
const uchar *e22 = rsGetElementAt(gIn, x, y); 
const uchar *e32 = rsGetElementAt(gIn, e, y); 

const uchar *e13 = rsGetElementAt(gIn, w, s); 
const uchar *e23 = rsGetElementAt(gIn, x, s); 
const uchar *e33 = rsGetElementAt(gIn, e, s); 

float r1 = ((*e12 - *e32)*3 + *e11 + *e13 - *e31 - *e33); 
float r2 = ((*e21 - *e23)*3 + *e11 - *e13 + *e31 - *e33); 
uchar res=(uchar)clamp(sqrt((r1*r1+r2*r2)), 0.0f, 255.0f); 
return (uchar4){res, res, res,(uchar)255}; 
} 

oder auch dies nicht funktioniert:

void Edge(const uchar *v_in, uchar4 *v_out, const void *usrData, uint32_t x, uint32_t y){ 

uint32_t n = max(y - 1, (uint32_t)0); 
uint32_t s = min(y + 1, (uint32_t)height); 
uint32_t e = min(x + 1, (uint32_t)width); 
uint32_t w = max(x - 1, (uint32_t)0); 
const uchar *e11 = rsGetElementAt(gIn, w, n); 
const uchar *e21 = rsGetElementAt(gIn, x, n); 
const uchar *e31 = rsGetElementAt(gIn, e, n); 

const uchar *e12 = rsGetElementAt(gIn, w, y); 
const uchar *e22 = rsGetElementAt(gIn, x, y); 
const uchar *e32 = rsGetElementAt(gIn, e, y); 

const uchar *e13 = rsGetElementAt(gIn, w, s); 
const uchar *e23 = rsGetElementAt(gIn, x, s); 
const uchar *e33 = rsGetElementAt(gIn, e, s); 

// 1 0 -1 
// 2 0 -2 
// 1 0 -1 
float r1 = ((*e12 - *e32)*3 + *e11 + *e13 - *e31 - *e33); 
float r2 = ((*e21 - *e23)*3 + *e11 - *e13 + *e31 - *e33); 
uchar res=(uchar)clamp(sqrt((r1*r1+r2*r2)), 0.0f, 255.0f); 
*v_out = (uchar4){res, res, res,(uchar)255}; 
} 

letzten beiden Zeilen (return und uchar Teil) verursacht Fehler. Übrigens, wenn ich "Return 10" oder so etwas wende, funktioniert es.

Dies ist Java-Teil:

public Bitmap doFilter(byte[] data) { 

    _inData.copy1DRangeFrom(0, _previewSamples, data); 
    _inData_yuv.copyFrom(data); 
    _filtersLib.forEach_Edge2(_inData, _outData); 
    yuvToRgbIntrinsic.forEach(_outData_rgb); 
    _filtersLib.forEach_combine(_outData, _outData); 
    _outData.copyTo(_outBmp); 
    return _outBmp;//Bitmap.createScaledBitmap(_outBmp, x, y, false); 
} 

gibt es mehrere ScriptC Instanzen in der App. Ist das ein Problem oder kann es sein? (Exakt die gleichen Sobel-Kantenerkennungscodes in anderen rs Dateien ohne Probleme arbeiten)

Fehler:

Fatal signal 7 (SIGBUS), code 2, fault addr 0x8cf7ffff in tid 22666 (om.sketchcamera) 

                [ 12-27 18:36:37.275 317: 317 W/   ] 
                debuggerd: handling request: pid=22625 uid=10124 gid=10124 tid=22666 

Device: General Mobile Android ein (android N)

Vielen Dank für jede Hilfe

+0

Überprüfen Sie einfach, ob Sie die RenderScript-Support-Bibliothek verwenden oder nicht. –

+0

versuchten beide, sie geben beide den gleichen Fehler –

Antwort

2

Sie verwenden unsigned Datentyp x und y-Wert zu übergeben, und dann erwarten, dass Dinge wie max(y - 1, (uint32_t)0); richtig zu arbeiten? Sie machen links- und rechtsbündige Speicherzugriffe und damit Fehler.

Verwandte Themen