Android のアーム アセンブリで配列配列を反復処理したいのですが、FATAL SIGNAL エラーが発生してアプリがクラッシュします。
中に入っているものをお見せします。
まず、jni を使用して Java から C コードにアクセスしています。
私はネイティブ関数を宣言しました:
public native byte[] BitmapToGrayscale(byte[] bitmap);
その後、この関数を呼び出してコードを呼び出します。
private void ConvertImageToGrayscale()
{
if(image == null)
{
GetLenaBack();
info("Nie było obrazu, ustawiono domyślny.");
}
ByteBuffer bb = ByteBuffer.allocate(image.getByteCount());
image.copyPixelsToBuffer(bb);
info("Start");
ByteBuffer result = ByteBuffer.wrap(this.BitmapToGrayscale(bb.array()));
info("Stop");
image.copyPixelsFromBuffer(result);
display.setImageBitmap(image);
}
C の関数は次のようになります。
JNIEXPORT jbyteArray JNICALL Java_pl_marekbar_Main_BitmapToGrayscale
(JNIEnv * env, jobject thisObj, jbyteArray bitmap)
{
jbyte arraySize = (*env)->GetArrayLength(env, bitmap);
jbyte *arrayAddress = (*env)->GetByteArrayElements(env, bitmap, 0);
jbyte cellSize = sizeof((*env)->GetByteArrayElements(env, bitmap, 0));
Grayscale(arrayAddress, arraySize, cellSize);
return bitmap;
}
そして最後に、これは私のasmコードです:
@ This file is jni/Grayscale.s
.text
.align 2
.global Grayscale
.type Grayscale, %function
Grayscale:
@Convert to grayscale
stmfd sp!, {fp,ip,lr}
@r0 - pointer
@r1 - array length
@r2 - array element size
mov r3, #0 @current element
array_loop:
ldr r4, [r0] @load element to memory
str r4, [r0] @store element in memory
add r0, r0, r4 @move pointer
add r3, r3, #1 @increment index
cmp r3, r1 @compare current index with array length
bne array_loop @when index smaller than array length still iterate
ldmfd sp!, {fp,ip,lr}
bx lr
.size Grayscale, .-Grayscale
arm asm で c コードから渡された配列を適切に操作する方法を見つける必要があります。画像処理用のアプリを準備していて、迅速でなければならないため、C でこれを行いたくありません。