天天看點

jni數組使用(二)

上一篇說到在java中調用c++函數中,如何使用jni數組。

下面談一談在回調中如何使用jni數組。

假如有一個java函數:

[cpp] view

plaincopy

public void receive(char buffer[],int length)  

我們需要在c++中調用這個函數,在jni中該如何實作數組的轉換?(本篇不涉及jni的回調函數的實作機制)

實作如下:

static void receive_callback(unsigned char *buf, int len)  

{  

    int i;  

        jnienv* env = androidruntime::getjnienv();//外部函數,獲得java環境變量  

    jchararray array = env->newchararray(len);//定義資料變量  

    jchar *parray ;  

    if(array == null){  

        loge("receive_callback: newchararray error.");  

        return;   

    }  

    parray = (jchar*)calloc(len, sizeof(jchar));//開辟jchar類型記憶體空間  

    if(parray == null){  

        loge("receive_callback: calloc error.");  

    //copy buffer to jchar array  

    for(i = 0; i < len; i++)  

    {  

        *(parray + i) = *(buf + i);//複制buf資料元素到parray記憶體空間  

    //copy buffer to jchararray  

    env->setchararrayregion(array,0,len,parray);//複制parray的jchar資料元素到jchararray  

    //invoke java callback method  

       env->callvoidmethod(mcallbacksobj, method_receive,array,len);//調用回調函數,method_receive = env->getmethodid(clazz, "receive", "([ci)v");  

    //release resource  

    env->deletelocalref(array);  

    free(parray);  

    parray = null;  

    checkandclearexceptionfromcallback(env, __function__);//外部函數  

}