NDK的jint问题

时间:2011-03-06 15:12:07

标签: android-ndk

我正在尝试使用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 个答案:

答案 0 :(得分:1)

......好吧,我很蠢......

我的方法签名错了......他们总是必须有“JNIEnv * env,jobject obj”作为前两个成员...我花了一个下午就这个但是好的是现在我永远不会忘记它!

另外,在我的第一种方法中,我不得不改变

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

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

因为前一个返回一个NULL指针