J'ai un ASUS Nexus 7 exécutant Android 4.2.2 Mon application est génératrice d'un SIGSEGV dans SK_MALLOC_FLAGS lors de l'exécution du code suivant:
I/DEBUG ( 124): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadbaad I/DEBUG ( 124): r0 00000027 r1 deadbaad r2 4017f258 r3 00000000 I/DEBUG ( 124): r4 00000000 r5 bed72434 r6 bed72508 r7 1be773bc I/DEBUG ( 124): r8 1be730f9 r9 000042c3 sl 00000001 fp 67185010 I/DEBUG ( 124): ip 40443f3c sp bed72430 lr 401522f9 pc 4014e992 cpsr 60000030 ... I/DEBUG ( 124): backtrace: I/DEBUG ( 124): #00 pc 0001a992 /system/lib/libc.so I/DEBUG ( 124): #01 pc 00018070 /system/lib/libc.so (abort+4) I/DEBUG ( 124): #02 pc 000be4b4 /system/lib/libskia.so (sk_malloc_flags(unsigned int, unsigned int)+28) I/DEBUG ( 124): #03 pc 0008afc0 /system/lib/libskia.so (SkRegion::op(SkRegion const&, SkRegion const&, SkRegion::Op)+1716) I/DEBUG ( 124): #04 pc 00089448 /system/lib/libskia.so (SkRasterClip::op(SkRasterClip const&, SkRegion::Op)+128)
3 Réponses :
Il ressemble à Canvas.clippath () n'est pas pris en charge avec une accélération matérielle, au moins Doc affirme que: http://developer.android.com/Guide/topics/graphics /hardware-accel.html#unsupporté p>
La seule solution de contournement qui me vient à l'esprit consiste à désactiver l'accélération matérielle. p>
Vous pouvez le faire sur: p>
niveau d'application niveau d'activité niveau de vue Docs:
dans Manifest P> Li>
Android: Hardwareaccelerated = "False" Code>
Pour l'activité dans Manifest P> LI>
vue.setlayertype (vue.layer_type_software, null); code>
Pour une vue individuelle à l'exécution p> li>
ul>
http://developer.android.com/guide/topics/graphics /hardware-accel.html#Controlling p>
Allumer ou désactiver l'accélération matérielle n'affecte pas l'accident. La toile n'est pas associée à une vue.
Est 12240 x 15840 code> pas un peu à gros pour une image? Avez-vous essayé avec des dimensions plus petites?
OK, laissez-moi mettre ceci dans une réponse, car il a l'air assez logique pour moi:
Pour voir si le problème voit à partir des appels continus à Une autre chose que je peux penser, c'est si vous les dessinez séparément: P> Clippath (chemin) code>, essayez de supprimer l'appel au début ou à la mise en place
canvas.clippath (quatrième, région.op.replace); code> à la place de
Canvas.clippath (quatrième); code> et voir si c'est la cause . P>
Picture picture = new Picture();
Canvas canvas = picture.beginRecording(12240, 15840);
canvas.clipPath(firstPath);
picture.endRecording();
canvas = picture.beginRecording(12240, 15840);
canvas.clipPath(fourthPath);
picture.endRecording();
Ceci ressemble à un boîtier de coin malade pour Clippath code> Manipulation.
Picture picture = new Picture();
Canvas canvas = picture.beginRecording(12240, 15840);
Path path = new Path();
path.moveTo(3058, 12365);
path.lineTo(8499, 3038);
path.lineTo(9494, 3619);
path.lineTo(4053, 12946);
path.close();
canvas.clipPath(path);
// do stuff with canvas
path.moveTo(3065, 12332);
path.lineTo(4053, 12926);
path.lineTo(9615, 3669);
path.lineTo(8628, 3075);
path.close();
canvas.clipPath(path, Region.Op.REPLACE);
// do more stuff with canvas
picture.endRecording();
return picture;
Que se passe-t-il, si vous ne laissez que
canvas.clippath (FirstPath); code>, supprimer un appel pour
quatrième code>?
Essayez si vous mettez
canvas.clippath (quatrième, région.op.replace); code> et voir si c'est la cause, sinon, alors que David Jashi a dit, essayez de supprimer l'appel pour voir si c'est le problème.
Une autre chose que je peux penser, c'est si vous les dessinez séparément:
image image = nouvelle image (); Canvas canvas = image.beginRecording (12240, 15840); Canvas.clippath (FirstPath); image.endrecording (); canvas = image.beginrecording (12240, 15840); canvas.clippath (quatrième, région.op.op.op.Intersect); code> / * Vous pouvez également essayer sans
région.op.intersect code> * /
image.endrecording (); code >