`
ai_longyu
  • 浏览: 479122 次
社区版块
存档分类
最新评论

JNI的某些数组和字符串类型转换(转)

 
阅读更多
JNICC++C#Windows
jbytearray转c++byte数组
C代码复制代码收藏代码
  1. jbyte*arrayBody=env->GetByteArrayElements(data,0);
  2. jsizetheArrayLengthJ=env->GetArrayLength(data);
  3. BYTE*starter=(BYTE*)arrayBody;


jbyteArray 转 c++中的BYTE[]
C代码复制代码收藏代码
  1. //jbytearraystrIn
  2. jbyte*olddata=(jbyte*)env->GetByteArrayElements(strIn,0);
  3. jsizeoldsize=env->GetArrayLength(strIn);
  4. BYTE*bytearr=(BYTE*)olddata;
  5. intlen=(int)oldsize;


C++中的BYTE[]转jbyteArray
C代码复制代码收藏代码
  1. //nOutSize是BYTE数组的长度BYTEpData[]
  2. jbyte*by=(jbyte*)pData;
  3. jbyteArrayjarray=env->NewByteArray(nOutSize);
  4. env->SetByteArrayRegin(jarray,0,nOutSize,by);


jbyteArray 转 char *
C代码复制代码收藏代码
  1. char*data=(char*)env->GetByteArrayElements(strIn,0);

char* 转jstring
C代码复制代码收藏代码
  1. jstringWindowsTojstring(JNIEnv*env,char*str_tmp)
  2. {
  3. jstringrtn=0;
  4. intslen=(int)strlen(str_tmp);
  5. unsignedshort*buffer=0;
  6. if(slen==0)
  7. {
  8. rtn=env->NewStringUTF(str_tmp);
  9. }
  10. else
  11. {
  12. intlength=MultiByteToWideChar(CP_ACP,0,(LPCSTR)str_tmp,slen,NULL,0);
  13. buffer=(unsignedshort*)malloc(length*2+1);
  14. if(MultiByteToWideChar(CP_ACP,0,(LPCSTR)str_tmp,slen,(LPWSTR)buffer,length)>0)
  15. {
  16. rtn=env->NewString((jchar*)buffer,length);
  17. }
  18. }
  19. if(buffer)
  20. {
  21. free(buffer);
  22. }
  23. returnrtn;
  24. }


下面这个没有用过,刚看到,也写进来,以后如果遇到可以验证下看。

jstring 转 char* 或者 const char*
C代码复制代码收藏代码
  1. //jstringstr
  2. constchar*key=env->GetStringUTFChars(str,0);
  3. //jbooleanisOffer
  4. jsClient->modify(key,isOffer);
  5. env->ReleaseStringUTFChars(str,key);


JNI 返回 jbyteArray
C代码复制代码收藏代码
  1. JNIEXPORTjbyteArrayJNICALLJava_Test_getByteArray(JNIEnv*env,jobjectobj)
  2. {
  3. jbyteArrayfirstMacArray=env->NewByteArray(6);
  4. ......
  5. jbyte*bytes=env->GetByteArrayElements(firstMacArray,0);
  6. for(inti=0;i<sizeof(pAdapterInfo->Address);i++)
  7. {
  8. bytes[i]=pAdapterInfo->Address[i];
  9. }
  10. env->SetByteArrayRegion(firstMacArray,0,6,bytes);
  11. returnfirstMacArray;
  12. }


//jstring to char*
C代码复制代码收藏代码
  1. char*jstringTostring(JNIEnv*env,jstringjstr)
  2. {
  3. char*rtn=NULL;
  4. jclassclsstring=env->FindClass("java/lang/String");
  5. jstringstrencode=env->NewStringUTF("utf-8");
  6. jmethodIDmid=env->GetMethodID(clsstring,"getBytes","(Ljava/lang/String;)[B");
  7. jbyteArraybarr=(jbyteArray)env->CallObjectMethod(jstr,mid,strencode);
  8. jsizealen=env->GetArrayLength(barr);
  9. jbyte*ba=env->GetByteArrayElements(barr,JNI_FALSE);
  10. if(alen>0)
  11. {
  12. rtn=(char*)malloc(alen+1);
  13. memcpy(rtn,ba,alen);
  14. rtn[alen]=0;
  15. }
  16. env->ReleaseByteArrayElements(barr,ba,0);
  17. returnrtn;
  18. }


//char* to jstring
C代码复制代码收藏代码
  1. jstringstoJstring(JNIEnv*env,constchar*pat)
  2. {
  3. jclassstrClass=env->FindClass("Ljava/lang/String;");
  4. jmethodIDctorID=env->GetMethodID(strClass,"<init>","([BLjava/lang/String;)V");
  5. jbyteArraybytes=env->NewByteArray(strlen(pat));
  6. env->SetByteArrayRegion(bytes,0,strlen(pat),(jbyte*)pat);
  7. jstringencoding=env->NewStringUTF("utf-8");
  8. return(jstring)env->NewObject(strClass,ctorID,bytes,encoding);
  9. }


//将jstring类型转换成windows类型
C代码复制代码收藏代码
  1. char*jstringToWindows(JNIEnv*env,jstringjstr)
  2. {
  3. intlength=(env)->GetStringLength(jstr);
  4. constjchar*jcstr=(env)->GetStringChars(jstr,0);
  5. char*rtn=(char*)malloc(length*2+1);
  6. intsize=0;
  7. size=WideCharToMultiByte(CP_ACP,0,(LPCWSTR)jcstr,length,rtn,(length*2+1),NULL,NULL);
  8. if(size<=0)
  9. returnNULL;
  10. (env)->ReleaseStringChars(jstr,jcstr);
  11. rtn[size]=0;
  12. returnrtn;
  13. }

//将windows类型转换成jstring类型
C代码复制代码收藏代码
  1. jstringWindowsTojstring(JNIEnv*env,char*str)
  2. {
  3. jstringrtn=0;
  4. intslen=strlen(str);
  5. unsignedshort*buffer=0;
  6. if(slen==0)
  7. rtn=(env)->NewStringUTF(str);
  8. else
  9. {
  10. intlength=MultiByteToWideChar(CP_ACP,0,(LPCSTR)str,slen,NULL,0);
  11. buffer=(unsignedshort*)malloc(length*2+1);
  12. if(MultiByteToWideChar(CP_ACP,0,(LPCSTR)str,slen,(LPWSTR)buffer,length)>0)
  13. rtn=(env)->NewString((jchar*)buffer,length);
  14. }
  15. if(buffer)
  16. free(buffer);
  17. returnrtn;
  18. }
  19. /*JNIEXPORTjstringJNICALLJava_test_cs_web_SWIFTAlianceCASmfTest_strcal
  20. (JNIEnv*env,jclassobj,jstringjstr1,jstringjstr2)
  21. {
  22. jbyteArraybytes=0;
  23. jthrowableexc;
  24. char*pszResult=NULL;
  25. char*pszSTR1=NULL;
  26. char*pszSTR2=NULL;
  27. pszSTR1=jstringTostring(env,jstr1);
  28. pszSTR2=jstringTostring(env,jstr2);
  29. intnlen=sizeof(char)*(strlen(pszSTR1)+strlen(pszSTR2));
  30. pszResult=(char*)malloc(nlen);
  31. strcpy(pszResult,pszSTR1);
  32. strcat(pszResult,pszSTR2);
  33. jstringjstrRe=stoJstring(env,pszResult);
  34. free(pszSTR1);
  35. free(pszSTR2);
  36. free(pszResult);
  37. return(jstrRe);
  38. }
  39. */



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[]
C代码复制代码收藏代码
  1. jfieldIDbyteData=(env)->GetFieldID(clazz,"bData","[B");
  2. jbyteArraypDataIn=(jbyteArray)(env)->GetObjectField(objDataIn,byteData);
  3. jsizetheArrayLeng=env->GetArrayLength(pDataIn);

//byte[]转为BYTE[]
C代码复制代码收藏代码
  1. jbyte*arrayBody=env->GetByteArrayElements(pDataIn,0);
  2. BYTE*jDataIn=(BYTE*)arrayBody;



//将BYTE数组转为jarray
C代码复制代码收藏代码
  1. jbyte*byte=(jbyte*)jDataOut;
  2. jbyteArrayjarray=env->NewByteArray(theArrayLeng);
  3. env->SetByteArrayRegion(jarray,0,theArrayLeng,byte);


//给每一个实例的变量付值
C代码复制代码收藏代码
  1. (env)->SetObjectField(objDataIn,byteData,jarray);
  2. (env)->SetIntField(objDataIn,pDataInLen,jDataInLen);
  3. (env)->ReleaseByteArrayElements(pDataIn,arrayBody,0);


其他参考:
Java 通过JNI调用C或者CPP代码
http://blog.csdn.net/kenera/archive/2009/02/16/3895343.aspx
http://apps.hi.baidu.com/share/detail/15732549
http://dniit.blog.163.com/blog/static/28012894200842810332491/
http://hi.baidu.com/liangwind/blog/item/7dcce2c9729d1d1e7f3e6f49.html
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics