Я пытаюсь сделать свою первую нативную функцию с 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