1
我試圖使我的第一個本地函數與NDK和我很麻煩與非常基本的東西。與NDK jint問題
請考慮下面的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));
這是什麼我得到:「sum is 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雪豹,NDK-R5B。我運行ENV是Nexus One的2.3.3
GetDirectBufferAddress僅適用於具有「直接」使用java.nio.ByteBuffer對象。 – fadden 2011-03-09 00:46:45