2017-10-31 28 views
0

私は、Samsung Galaxy J5、Android 6.0.1、Kernel 3.10.49-11903637の2つのテストデバイスで問題が発生しています。 MMB29M.J510FNXXU2AQG3 GPU Adreno 306、Nexus 4 -GPU Adreno 320をビルドしてください。 ビットマップで2回のフィルタ処理を行い、ビットマップのシャープネスを計算しようとしています。パフォーマンスのために、元のビットマップのサンプリングされたサイズが使用されます(64x64未満のサイズ)。 同じコードはSamsung Galaxy S6、Sony Xperia Z3、Samsung Galaxy Tab 10.1(2016)、Huawei P10で正常に動作します。 入力パラメータを変更しようとしましたが、異なる画像、異なる係数を使用しましたが、J5では常にクラッシュします。Android RenderScriptシグナル7(SIGBUS)、コード1(BUS_ADRALN)、フォールトaddr 0x76f458b4 Adreno 306,320

更新: 他のデバイスで撮影された写真の場合は、ポートレート(幅よりも大きい高さ)に回転したときに正常に通過します。 写真は同じデバイスで撮影されましたが、どのように回転させるのか分かりません。この最後の行で

val options = BitmapFactory.Options() 
options.inJustDecodeBounds = true 
BitmapFactory.decodeFile(imagePath, options) 

val imageSize = SizeT(options.outWidth, options.outHeight) 
val imageScale = imageSize.scaleToFitInSize(SizeT(64, 64)) 
val imageScaledSize = imageSize.scale(imageScale.toDouble()) 
options.inJustDecodeBounds = false 
options.inSampleSize = ImageUtils.calculateInSampleSize(imageSize, imageScaledSize, 1.0) 

val sourceBitmap = BitmapFactory.decodeFile(imagePath, options) 

var sobelScript: ScriptC_sobel? = null 
var inputAllocation: Allocation? = null 
var outputAllocation: Allocation? = null 
var intermediateAllocation: Allocation? = null 
var convolve3x3: ScriptIntrinsicConvolve3x3? = null 
var renderScript: RenderScript? = null 

val imageWidth = sourceBitmap.width 
val imageHeight = sourceBitmap.height 

renderScript = RenderScript.create(ApplicationContext.ApplicationContext()) 
inputAllocation = Allocation.createFromBitmap(renderScript, sourceBitmap) 
val typeInBuilder = Type.Builder(renderScript, Element.F32_4(renderScript)).setX(imageWidth).setY(imageHeight ) 

// Allocation where to store the sum result (for output purposes) 
val coefficientsGx = floatArrayOf(-1f, 0f, 1f, -2f, 0f, 2f, -1f, 0f, 1f) 
val coefficientsGy = floatArrayOf(-1f, -2f, -1f, 0f, 0f, 0f, 1f, 2f, 1f) 

intermediateAllocation = Allocation.createTyped(renderScript, typeInBuilder.create()) 

convolve3x3 = ScriptIntrinsicConvolve3x3.create(renderScript, Element.F32_4(renderScript)) 
convolve3x3.setInput(inputAllocation) 
convolve3x3.setCoefficients(coefficientsGx) 
convolve3x3.forEach(intermediateAllocation) 

は、プログラムがネイティブのエラーでクラッシュ:

? D/NetworkController.MobileSignalController(0/2147483643): onSignalStrengthsChanged signalStrength=SignalStrength: 26 99 -120 -160 -120 -1 -1 99 2147483647 2147483647 2147483647 -1 2147483647 0x4 gsm|lte level=4 
2302-2671/? D/NetworkController.MobileSignalController(0/2147483643): getMobileIconGroup(): 0 
16440-17400/ A/libc: Fatal signal 7 (SIGBUS), code 1, fault addr 0x76f458b4 in tid 17400 (AsyncTask #4) 
16440-17398/ A/libc: Fatal signal 7 (SIGBUS), code 1, fault addr 0x76f456d4 in tid 17398 (AsyncTask #4) 
16440-17398/ I/libc: Another thread contacted debuggerd first; not contacting debuggerd. 
16440-17399/ A/libc: Fatal signal 7 (SIGBUS), code 1, fault addr 0x76f45404 in tid 17399 (AsyncTask #4) 
16440-17399/ I/libc: Another thread contacted debuggerd first; not contacting debuggerd. 
16440-17396/ A/libc: Fatal signal 7 (SIGBUS) in tid 17396 (AsyncTask #4) 
16440-17396/I/libc: Another thread contacted debuggerd first; not contacting debuggerd. 
400-400/? A/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** 
400-400/? A/DEBUG: Build fingerprint: 'samsung/j5xnltexx/j5xnlte:6.0.1/MMB29M/J510FNXXU2AQG3:user/release-keys' 
400-400/? A/DEBUG: Revision: '4' 
400-400/? A/DEBUG: ABI: 'arm' 
400-400/? A/DEBUG: pid: 16440, tid: 17400, name: AsyncTask #4 >>> com.test.development <<< 
400-400/? A/DEBUG: signal 7 (SIGBUS), code 1 (BUS_ADRALN), fault addr 0x76f458b4 
400-400/? A/DEBUG:  r0 0000003b r1 00000000 r2 b8ceb4a0 r3 76f458b4 
400-400/? A/DEBUG:  r4 76f458b4 r5 9b68a7f8 r6 b8ceb4a0 r7 00000000 
400-400/? A/DEBUG:  r8 0000003c r9 76f459a4 sl 76f458b4 fp 76f45a94 
400-400/? A/DEBUG:  ip b8cb3c14 sp 9b68a7b0 lr 00000001 pc 9cff66d8 cpsr 200f0030 
400-400/? A/DEBUG: backtrace: 
400-400/? A/DEBUG:  #00 pc 0002d6d8 /system/lib/libRSCpuRef.so 
400-400/? A/DEBUG:  #01 pc 0002d68b /system/lib/libRSCpuRef.so (_ZN7android12renderscript32RsdCpuScriptIntrinsicConvolve3x38kernelF4EPK24RsExpandKernelDriverInfojjj+122) 
400-400/? A/DEBUG:  #02 pc 0001f1f5 /system/lib/libRSCpuRef.so 
400-400/? A/DEBUG:  #03 pc 0001eb67 /system/lib/libRSCpuRef.so (_ZN7android12renderscript19RsdCpuReferenceImpl16helperThreadProcEPv+138) 
400-400/? A/DEBUG:  #04 pc 00041813 /system/lib/libc.so (_ZL15__pthread_startPv+30) 
400-400/? A/DEBUG:  #05 pc 00019315 /system/lib/libc.so (__start_thread+6) 

com.test.development A/libc: Fatal signal 7 (SIGBUS) in tid 3368 (AsyncTask #4) 
? E/audit: type=1701 msg=audit(1509449660.557:282): auid=4294967295 uid=10133 gid=10133 ses=4294967295 subj=u:r:untrusted_app:s0:c512,c768 pid=3371 comm=4173796E635461736B202334 reason="memory violation" sig=7 

答えて

0

はそう問題は、convolve3x3.forEach関数にScript.LaunchOptionsを渡すカーネルが動作する上で交差点を制限することで解決しました。割り当ての範囲内でそれを設定することは仕事をしました。

renderScript = RenderScript.create(ApplicationContext.ApplicationContext()) 
inputAllocation = Allocation.createFromBitmap(renderScript, sourceBitmap) 
val typeInBuilder = Type.Builder(renderScript, Element.F32_4(renderScript)).setX(imageWidth).setY(imageHeight ) 
val launchOptions = Script.LaunchOptions() 
launchOptions.setX(0, imageWidth-1) 
launchOptions.setY(0, imageHeight-1) 
launchOptions.setZ(0, 1) 

// Allocation where to store the sum result (for output purposes) 
val coefficientsGx = floatArrayOf(-1f, 0f, 1f, -2f, 0f, 2f, -1f, 0f, 1f) 
val coefficientsGy = floatArrayOf(-1f, -2f, -1f, 0f, 0f, 0f, 1f, 2f, 1f) 

intermediateAllocation = Allocation.createTyped(renderScript, typeInBuilder.create()) 

convolve3x3 = ScriptIntrinsicConvolve3x3.create(renderScript, Element.F32_4(renderScript)) 

convolve3x3.setInput(inputAllocation) 
convolve3x3.setCoefficients(coefficientsGx) 
convolve3x3.forEach(intermediateAllocation, launchOptions) 
関連する問題