jbytearray转c++byte数组
jbyteArray 转 c++中的BYTE[]
C++中的BYTE[]转jbyteArray
jbyteArray 转 char *
char* 转jstring
下面这个没有用过,刚看到,也写进来,以后如果遇到可以验证下看。
jstring 转 char* 或者 const char*
JNI 返回 jbyteArray
//jstring to char*
//char* to jstring
//将jstring类型转换成windows类型
//将windows类型转换成jstring类型
jni object的使用
每一个jni格式的dll中的object对应该java里面的一个类。
如下例有一个 ObjData类,类中有成员bData ,Len
public class ObjData {
public byte[] bData;
public int Len;
}
//------------------------jni获得传过来的Object类型的变量objDataIn--------
jclass clazz =(env)->FindClass("ObjData");
//从传进来的对象中取出byte[]
//byte[]转为BYTE[]
//将BYTE数组转为jarray
//给每一个实例的变量付值
- jbyte*arrayBody=env->GetByteArrayElements(data,0);
- jsizetheArrayLengthJ=env->GetArrayLength(data);
- BYTE*starter=(BYTE*)arrayBody;
jbyteArray 转 c++中的BYTE[]
- //jbytearraystrIn
- jbyte*olddata=(jbyte*)env->GetByteArrayElements(strIn,0);
- jsizeoldsize=env->GetArrayLength(strIn);
- BYTE*bytearr=(BYTE*)olddata;
- intlen=(int)oldsize;
C++中的BYTE[]转jbyteArray
- //nOutSize是BYTE数组的长度BYTEpData[]
- jbyte*by=(jbyte*)pData;
- jbyteArrayjarray=env->NewByteArray(nOutSize);
- env->SetByteArrayRegin(jarray,0,nOutSize,by);
jbyteArray 转 char *
- char*data=(char*)env->GetByteArrayElements(strIn,0);
char* 转jstring
- jstringWindowsTojstring(JNIEnv*env,char*str_tmp)
- {
- jstringrtn=0;
- intslen=(int)strlen(str_tmp);
- unsignedshort*buffer=0;
- if(slen==0)
- {
- rtn=env->NewStringUTF(str_tmp);
- }
- else
- {
- intlength=MultiByteToWideChar(CP_ACP,0,(LPCSTR)str_tmp,slen,NULL,0);
- buffer=(unsignedshort*)malloc(length*2+1);
- if(MultiByteToWideChar(CP_ACP,0,(LPCSTR)str_tmp,slen,(LPWSTR)buffer,length)>0)
- {
- rtn=env->NewString((jchar*)buffer,length);
- }
- }
- if(buffer)
- {
- free(buffer);
- }
- returnrtn;
- }
下面这个没有用过,刚看到,也写进来,以后如果遇到可以验证下看。
jstring 转 char* 或者 const char*
- //jstringstr
- constchar*key=env->GetStringUTFChars(str,0);
- //jbooleanisOffer
- jsClient->modify(key,isOffer);
- env->ReleaseStringUTFChars(str,key);
JNI 返回 jbyteArray
- JNIEXPORTjbyteArrayJNICALLJava_Test_getByteArray(JNIEnv*env,jobjectobj)
- {
- jbyteArrayfirstMacArray=env->NewByteArray(6);
- ......
- jbyte*bytes=env->GetByteArrayElements(firstMacArray,0);
- for(inti=0;i<sizeof(pAdapterInfo->Address);i++)
- {
- bytes[i]=pAdapterInfo->Address[i];
- }
- env->SetByteArrayRegion(firstMacArray,0,6,bytes);
- returnfirstMacArray;
- }
//jstring to char*
- char*jstringTostring(JNIEnv*env,jstringjstr)
- {
- char*rtn=NULL;
- jclassclsstring=env->FindClass("java/lang/String");
- jstringstrencode=env->NewStringUTF("utf-8");
- jmethodIDmid=env->GetMethodID(clsstring,"getBytes","(Ljava/lang/String;)[B");
- jbyteArraybarr=(jbyteArray)env->CallObjectMethod(jstr,mid,strencode);
- jsizealen=env->GetArrayLength(barr);
- jbyte*ba=env->GetByteArrayElements(barr,JNI_FALSE);
- if(alen>0)
- {
- rtn=(char*)malloc(alen+1);
- memcpy(rtn,ba,alen);
- rtn[alen]=0;
- }
- env->ReleaseByteArrayElements(barr,ba,0);
- returnrtn;
- }
//char* to jstring
- jstringstoJstring(JNIEnv*env,constchar*pat)
- {
- jclassstrClass=env->FindClass("Ljava/lang/String;");
- jmethodIDctorID=env->GetMethodID(strClass,"<init>","([BLjava/lang/String;)V");
- jbyteArraybytes=env->NewByteArray(strlen(pat));
- env->SetByteArrayRegion(bytes,0,strlen(pat),(jbyte*)pat);
- jstringencoding=env->NewStringUTF("utf-8");
- return(jstring)env->NewObject(strClass,ctorID,bytes,encoding);
- }
//将jstring类型转换成windows类型
- char*jstringToWindows(JNIEnv*env,jstringjstr)
- {
- intlength=(env)->GetStringLength(jstr);
- constjchar*jcstr=(env)->GetStringChars(jstr,0);
- char*rtn=(char*)malloc(length*2+1);
- intsize=0;
- size=WideCharToMultiByte(CP_ACP,0,(LPCWSTR)jcstr,length,rtn,(length*2+1),NULL,NULL);
- if(size<=0)
- returnNULL;
- (env)->ReleaseStringChars(jstr,jcstr);
- rtn[size]=0;
- returnrtn;
- }
//将windows类型转换成jstring类型
- jstringWindowsTojstring(JNIEnv*env,char*str)
- {
- jstringrtn=0;
- intslen=strlen(str);
- unsignedshort*buffer=0;
- if(slen==0)
- rtn=(env)->NewStringUTF(str);
- else
- {
- intlength=MultiByteToWideChar(CP_ACP,0,(LPCSTR)str,slen,NULL,0);
- buffer=(unsignedshort*)malloc(length*2+1);
- if(MultiByteToWideChar(CP_ACP,0,(LPCSTR)str,slen,(LPWSTR)buffer,length)>0)
- rtn=(env)->NewString((jchar*)buffer,length);
- }
- if(buffer)
- free(buffer);
- returnrtn;
- }
- /*JNIEXPORTjstringJNICALLJava_test_cs_web_SWIFTAlianceCASmfTest_strcal
- (JNIEnv*env,jclassobj,jstringjstr1,jstringjstr2)
- {
- jbyteArraybytes=0;
- jthrowableexc;
- char*pszResult=NULL;
- char*pszSTR1=NULL;
- char*pszSTR2=NULL;
- pszSTR1=jstringTostring(env,jstr1);
- pszSTR2=jstringTostring(env,jstr2);
- intnlen=sizeof(char)*(strlen(pszSTR1)+strlen(pszSTR2));
- pszResult=(char*)malloc(nlen);
- strcpy(pszResult,pszSTR1);
- strcat(pszResult,pszSTR2);
- jstringjstrRe=stoJstring(env,pszResult);
- free(pszSTR1);
- free(pszSTR2);
- free(pszResult);
- return(jstrRe);
- }
- */
jni object的使用
每一个jni格式的dll中的object对应该java里面的一个类。
如下例有一个 ObjData类,类中有成员bData ,Len
public class ObjData {
public byte[] bData;
public int Len;
}
//------------------------jni获得传过来的Object类型的变量objDataIn--------
jclass clazz =(env)->FindClass("ObjData");
//从传进来的对象中取出byte[]
- jfieldIDbyteData=(env)->GetFieldID(clazz,"bData","[B");
- jbyteArraypDataIn=(jbyteArray)(env)->GetObjectField(objDataIn,byteData);
- jsizetheArrayLeng=env->GetArrayLength(pDataIn);
//byte[]转为BYTE[]
- jbyte*arrayBody=env->GetByteArrayElements(pDataIn,0);
- BYTE*jDataIn=(BYTE*)arrayBody;
//将BYTE数组转为jarray
- jbyte*byte=(jbyte*)jDataOut;
- jbyteArrayjarray=env->NewByteArray(theArrayLeng);
- env->SetByteArrayRegion(jarray,0,theArrayLeng,byte);
//给每一个实例的变量付值
- (env)->SetObjectField(objDataIn,byteData,jarray);
- (env)->SetIntField(objDataIn,pDataInLen,jDataInLen);
- (env)->ReleaseByteArrayElements(pDataIn,arrayBody,0);