Как использовать функцию C на Android с NDK

Я хочу использовать функцию, написанную на C, в приложении для Android. Функция взята отсюда. Я изучил некоторые основы android NDK, я могу использовать эту функцию в своем исходном коде Java, но приложение зависает, когда я его вызываю, и мне приходится ждать, пока android предложит мне убить приложение.

Подпись JNI такова:

JNIEXPORT void JNICALL Java_pda_lupa_callbacks_MySurfaceCallback_NativeYuv2rgb
  (JNIEnv *env, jclass clazz,
  jbyteArray imageIn, jint widthIn, jint heightIn,
  jobject imageOut, jint widthOut, jint heightOut) {

    jbyte *cImageIn = (*env)->GetByteArrayElements(env, imageIn, NULL);
    jbyte *cImageOut = (jbyte*)(*env)->GetDirectBufferAddress(env, imageOut);


    toRGB565((unsigned short*)cImageIn, widthIn, heightIn, (unsigned int*)cImageOut, widthOut, heightOut);

    (*env)->ReleaseByteArrayElements(env, imageIn, cImageIn, JNI_ABORT);
}

Затем я загружаю его в Java следующим образом:

static {
    System.loadLibrary("rgb");
}

public native void NativeYuv2rgb(byte[] imageIn, int widthIn, int heightIn,
    java.nio.Buffer imageOut, int widthOut, int heightOut);

И когда я звоню, приложение зависает (я не получаю никакой ошибки):

NativeYuv2rgb(this.cameraFrame, this.prevX, this.prevY, 
              this.rgb, this.prevX, this.prevY);

Я думаю, что я мог бы использовать неправильные типы переменных для imageIn и imageOut, но я не знаю...

Спасибо за вашу помощь!

редактировать: это вывод из GDB:

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 4731]
0x8083f0b0 in ?? ()

1 ответ

ХОРОШО. Ошибка сегментации, является признаком плохой манипуляции указателем. Измените код на приведенный ниже пример и проверьте, работает ли он для вас: вы должны изменить все

jbyte *cImageIn = env->GetByteArrayElements(env, imageIn, NULL);
jbyte *cImageOut = (jbyte*) env->GetDirectBufferAddress(env, imageOut);
...
env->ReleaseByteArrayElements(env, imageIn, cImageIn, JNI_ABORT);
Другие вопросы по тегам