0

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 でこれを行いたくありません。

4

1 に答える 1