2011-03-06 53 views
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

回答

1

...好,我是個白癡......

我的方法簽名是錯誤的......他們總是必須擁有「JNIEnv * env,jobject obj」作爲前兩名成員......好吧,我在此花了一個下午,但好事是現在我永遠不會忘記它!

而且,在我的第一個方法,我不得不改變

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

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

與前一個是返回NULL指針

+0

GetDirectBufferAddress僅適用於具有「直接」使用java.nio.ByteBuffer對象。 – fadden 2011-03-09 00:46:45