проблема с jint с NDK - PullRequest
       0

проблема с jint с NDK

1 голос
/ 06 марта 2011

Я пытаюсь сделать свою первую нативную функцию с NDK, и у меня проблемы с очень простыми вещами.

Пожалуйста, рассмотрите следующий код c:

#include <jni.h>
#include <string.h>

JNIEXPORT jint JNICALL Java_eu_elevelcbt_sm_YCrCbUtils_toARGB(
        JNIEnv* env, jbyteArray src, jintArray out, jint width, jint height){


    jbyte *c_src = (*env)->GetByteArrayElements(env, src, NULL);
    jint *c_out = (*env)->GetDirectBufferAddress(env, out);

    if (c_out==NULL)
        return -1;

    int length = width * height;
    int co;
    unsigned int color;

    for (co=0; co<length; co++) {
        color = c_src[co] & 0xFF;
        color = 0xFF000000 | (color<<16) | (color<<8) | color;
        c_out[co] = color;
    }

    (*env)->ReleaseByteArrayElements(env, src, c_src, 0);

    return 0;
}

JNIEXPORT jint JNICALL Java_eu_elevelcbt_sm_YCrCbUtils_sum(jint a, jint b){
    return a+b;
}

иследующий класс Java:

public class YCrCbUtils {

    public native int toARGB(byte[] src, int[] out, final int width, final int height);

    public native int sum(int a, int b);

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

Проблема 1: Если я вызываю вторую функцию

Log.v("DBG", "sum is: " + new YCrCbUtils().sum(10, 5));

Это то, что я получаю: «сумма равна 1079199776» !!!!ЗАЧЕМ?!??!?: (

Если я попытаюсь вызвать первую функцию следующим образом:

int[] colors = new int[size.width * size.height]; // where width=800 and height=480
new YCrCbUtils().toARGB(data, colors, size.width, size.height); // data is a byte[]

Я получу ошибку SIGSEGV ...

ПОМОГИТЕ, пожалуйста !!!

PS: моя среда разработки - MAC OSX Snow Leopard, NDK-r5b. Моя среда выполнения - Nexus One 2.3.3

1 Ответ

1 голос
/ 06 марта 2011

... хорошо, я тупой ...

Мои сигнатуры методов были НЕПРАВИЛЬНЫ ... У них всегда должны быть "JNIEnv * env, jobject obj" в качестве первых двух участников ... хорошо я трачуднем, но хорошо, что теперь я никогда этого не забуду!

Кроме того, в моем первом методе мне пришлось поменять

jint *c_out = (*env)->GetDirectBufferAddress(env, out);

на

jint *c_out = (*env)->GetIntArrayElements(env, out, NULL);

как предыдущий возвращал нулевой указатель

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...