上一篇說到在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__);//外部函數
}