我正在尝试使用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
答案 0 :(得分:1)
......好吧,我很蠢......
我的方法签名错了......他们总是必须有“JNIEnv * env,jobject obj”作为前两个成员...我花了一个下午就这个但是好的是现在我永远不会忘记它!
另外,在我的第一种方法中,我不得不改变
jint *c_out = (*env)->GetDirectBufferAddress(env, out);
与
jint *c_out = (*env)->GetIntArrayElements(env, out, NULL);
因为前一个返回一个NULL指针