首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >JNI检测到应用程序出错( android多线程操作位图出错)

JNI检测到应用程序出错( android多线程操作位图出错)
EN

Stack Overflow用户
提问于 2018-09-29 18:31:18
回答 2查看 836关注 0票数 0

在我使用java的android studio项目中,我使用Executors(Executors.newFixedThreadPool将线程数初始化为3)来运行在位图上执行某些进程的线程。

但有时会在日志中显示此错误并使活动崩溃(我已经从每个日志的第一个日志中删除了时间和我的包名称)。

代码语言:javascript
复制
A/zygote: java_vm_ext.cc:504] JNI DETECTED ERROR IN APPLICATION: obj == null
A/zygote: java_vm_ext.cc:504]     in call to GetLongField
A/zygote: java_vm_ext.cc:504]     from void android.graphics.BaseCanvas.nDrawBitmapMatrix(long, android.graphics.Bitmap, long, long)
A/zygote: java_vm_ext.cc:504] "pool-5-thread-1" prio=5 tid=36 Runnable
A/zygote: java_vm_ext.cc:504]   | group="main" sCount=0 dsCount=0 flags=0 obj=0x12f40558 self=0xca63fa00
A/zygote: java_vm_ext.cc:504]   | sysTid=11252 nice=0 cgrp=default sched=0/0 handle=0xc39f5970
A/zygote: java_vm_ext.cc:504]   | state=R schedstat=( 98866144 6027605 20 ) utm=9 stm=0 core=6 HZ=100
E/proccess Bitmaps thread no:2t 2: 20
A/zygote: java_vm_ext.cc:504]   | stack=0xc38f3000-0xc38f5000 stackSize=1038KB
A/zygote: java_vm_ext.cc:504]   | held mutexes= "mutator lock"(shared held)
A/zygote: java_vm_ext.cc:504]   native: #00 pc 002c6aa3  /system/lib/libart.so (_ZN3art15DumpNativeStackERNSt3__113basic_ostreamIcNS0_11char_traitsIcEEEEiP12BacktraceMapPKcPNS_9ArtMethodEPv+130)
A/zygote: java_vm_ext.cc:504]   native: #01 pc 00359273  /system/lib/libart.so (_ZNK3art6Thread9DumpStackERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEEbP12BacktraceMapb+202)
A/zygote: java_vm_ext.cc:504]   native: #02 pc 00355757  /system/lib/libart.so (_ZNK3art6Thread4DumpERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEEbP12BacktraceMapb+34)
A/zygote: java_vm_ext.cc:504]   native: #03 pc 002308dd  /system/lib/libart.so (_ZN3art9JavaVMExt8JniAbortEPKcS2_+736)
A/zygote: java_vm_ext.cc:504]   native: #04 pc 00230d47  /system/lib/libart.so (_ZN3art9JavaVMExt9JniAbortFEPKcS2_z+66)
A/zygote: java_vm_ext.cc:504]   native: #05 pc 0027a0e5  /system/lib/libart.so (_ZN3art3JNI12GetLongFieldEP7_JNIEnvP8_jobjectP9_jfieldID+584)
A/zygote: java_vm_ext.cc:504]   native: #06 pc 000ce38f  /system/lib/libandroid_runtime.so (_ZN7android6bitmap8toBitmapEP7_JNIEnvP8_jobject+14)
A/zygote: java_vm_ext.cc:504]   native: #07 pc 000cda8b  /system/lib/libandroid_runtime.so (???)
A/zygote: java_vm_ext.cc:504]   native: #08 pc 0047b3e3  /system/framework/arm/boot-framework.oat (Java_android_graphics_BaseCanvas_nDrawBitmapMatrix__JLandroid_graphics_Bitmap_2JJ+162)
A/zygote: java_vm_ext.cc:504]   at android.graphics.BaseCanvas.nDrawBitmapMatrix(Native method)
A/zygote: java_vm_ext.cc:504]   at android.graphics.BaseCanvas.drawBitmap(BaseCanvas.java:111)
A/zygote: java_vm_ext.cc:504]   at android.graphics.Canvas.drawBitmap(Canvas.java:1496)
A/zygote: java_vm_ext.cc:504]   at ir.mytoon.app.MyTest.Struct.Operations.compose(Operations.java:206)
A/zygote: java_vm_ext.cc:504]   at ir.mytoon.app.MyTest.Struct.ProccessingDesing.doOperation(ProccessingDesing.java:188)
A/zygote: java_vm_ext.cc:504]   at ir.mytoon.app.MyTest.Struct.ProccessingDesing.makeFrame(ProccessingDesing.java:66)
A/zygote: java_vm_ext.cc:504]   at ir.mytoon.app.MyTest.MVP.Gif.GifProductMaker.ProccessingGif$proccessFrames.run(ProccessingGif.java:336)
A/zygote: java_vm_ext.cc:504]   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
A/zygote: java_vm_ext.cc:504]   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
A/zygote: java_vm_ext.cc:504]   at java.lang.Thread.run(Thread.java:784)

我的设备安卓版本是android O。如果我使用一个线程,这种情况就不会发生。

我认为导致崩溃的代码行是这样的:

代码语言:javascript
复制
canvas.drawBitmap(proccessingBitmap, processingBitmapMatrix, paint);

任何帮助都将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-29 21:37:08

所以我发现了问题并想分享给大家,希望对大家有所帮助!

实际上,在我的代码中的某些地方,我为后面的canvas.drawBitmap函数提供了位图。

由于我在后面的操作中使用位图的ArrayList,并且数组列表不是线程安全的,所以当我同时添加位图时,有时它们不会被添加和同步。因此,同步的一种方法是像这样使用同步块……

1-定义一个虚拟对象。2-每次使用arraylist时,在同步的块中执行此操作。

1-

代码语言:javascript
复制
 private final Object mutex = new Object();

2-

代码语言:javascript
复制
synchronized (mutex) {
                            myArrayList.add(myBitmapObject);
                        }
票数 2
EN

Stack Overflow用户

发布于 2021-09-04 16:45:10

嗯,我还不是专家,但我至少可以分享我所知道的。

我认为使用java内置的原子引用java.util.concurrent.atomic.AtomicReference<V>可能会有一些帮助,因为它提供了非阻塞原子读/写方法,但这取决于你实际需要什么。

下面的链接可能会帮助你做出决定,并更好地理解它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52567462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档