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

NDK编程:JNI与Java,C++字符类型转换 以前在做一个跨平台SDK项目中,需要用JNI对C++接口进行转换,供Android层进行调用,其类型转换问题,真是让人头痛不已,今日做以总结,希望帮助到有需要的朋友。 阅读详情

转载自:http://provista.iteye.com/blog/839703

jbytearray转c++byte数组 

C代码   收藏代码
  1. jbyte * arrayBody = env->GetByteArrayElements(data,0);   
  2. jsize theArrayLengthJ = env->GetArrayLength(data);   
  3. BYTE * starter = (BYTE *)arrayBody;   


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


C++中的BYTE[]转jbyteArray 
C代码   收藏代码
  1. //nOutSize是BYTE数组的长度 BYTE pData[]  
  2. jbyte *by = (jbyte*)pData;  
  3. jbyteArray jarray = 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. jstring WindowsTojstring(JNIEnv* env, char* str_tmp)  
  2. {  
  3.  jstring rtn=0;  
  4.  int slen = (int)strlen(str_tmp);  
  5.  unsigned short* buffer=0;  
  6.  if(slen == 0)  
  7.  {  
  8.   rtn = env->NewStringUTF(str_tmp);  
  9.  }  
  10.  else  
  11.  {  
  12.   int length = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)str_tmp, slen, NULL, 0);  
  13.   buffer = (unsigned short*)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.  return rtn;  
  24. }  


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

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


JNI 返回 jbyteArray 
C代码   收藏代码
  1. JNIEXPORT jbyteArray JNICALL Java_Test_getByteArray(JNIEnv *env, jobject obj)  
  2. {  
  3.     jbyteArray firstMacArray = env->NewByteArray( 6 );  
  4.     ......  
  5.     jbyte *bytes = env->GetByteArrayElements( firstMacArray, 0);  
  6.     for ( int i = 0; i < sizeof( pAdapterInfo->Address ); i++ )  
  7.     {  
  8.        bytes[ i ] = pAdapterInfo->Address[ i ];  
  9.     }  
  10.   
  11.     env->SetByteArrayRegion(firstMacArray, 0, 6, bytes );  
  12.     return firstMacArray;  
  13. }  


//jstring to char* 
C代码   收藏代码
  1. char* jstringTostring(JNIEnv* env, jstring jstr)  
  2. {          
  3.   char* rtn = NULL;  
  4.   jclass clsstring = env->FindClass("java/lang/String");  
  5.   jstring strencode = env->NewStringUTF("utf-8");  
  6.   jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B");  
  7.   jbyteArray barr= (jbyteArray)env->CallObjectMethod(jstr, mid, strencode);  
  8.   jsize alen = 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.   return rtn;  
  18. }  


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


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

//将windows类型转换成jstring类型 
C代码   收藏代码
  1. jstring WindowsTojstring( JNIEnv* env, char* str )  
  2. {  
  3. jstring rtn = 0;  
  4. int slen = strlen(str);  
  5. unsigned short * buffer = 0;  
  6. if( slen == 0 )  
  7. rtn = (env)->NewStringUTF(str );  
  8. else  
  9. {  
  10. int length = MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, NULL, 0 );  
  11. buffer = (unsigned short *)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. return rtn;  
  18. }  
  19. /*JNIEXPORT jstring JNICALL Java_test_cs_web_SWIFTAlianceCASmfTest_strcal 
  20. (JNIEnv *env, jclass obj, jstring jstr1, jstring jstr2) 
  21. { 
  22. jbyteArray bytes = 0; 
  23. jthrowable exc; 
  24. char *pszResult = NULL;     
  25. char *pszSTR1 = NULL; 
  26. char *pszSTR2 = NULL; 
  27.  
  28. pszSTR1 = jstringTostring(env, jstr1); 
  29. pszSTR2 = jstringTostring(env, jstr2); 
  30.  
  31.  
  32. int nlen = sizeof(char)*(strlen(pszSTR1)+strlen(pszSTR2)); 
  33. pszResult = (char*)malloc(nlen); 
  34. strcpy(pszResult, pszSTR1); 
  35. strcat(pszResult, pszSTR2); 
  36.  
  37. jstring jstrRe = stoJstring(env, pszResult); 
  38. free(pszSTR1); 
  39. free(pszSTR2); 
  40. free(pszResult); 
  41. return(jstrRe); 
  42. } 
  43. */  



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. jfieldID byteData = (env)->GetFieldID(clazz,"bData","[B");  
  2. jbyteArray pDataIn = (jbyteArray) (env)->GetObjectField(objDataIn, byteData);  
  3. jsize theArrayLeng = 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. jbyteArray jarray = 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.youkuaiyun.com/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

JNI 数组数据处理 JNI 中的数组分为基本类型数组和对象数组,它们的处理方式是不一样的,基本类型数组中的所有元素都是 JNI 的基本数据类型,可以直接访问。而对象数组中的所有元素是一个类的实例或其它数组的引用,和字符串操作一样,不能直接访问 Java 传递给 JNI 层的数组,必须选择合适的 JNI 函数来访问和设置 Java 层的数组对象。 访问基本类型数组 1、Java代码 //调用数组 byte a... 阅读详情

相关推荐

C++通过JNI调用JAVA方法返回ArrayList对象

获取系统已安装应用列表并返回List对象。在JAVA中调用JNI原生方法。

1755

JNI - JAVA 数据类型转换

基本数据类型转换 在 Java 中传递的参数类型是 int,而在 JNI 中就成了 jint,这就涉及到 Java 到 JNI 的数据类型转换。 Java 类型 Native 类型 字节长度 boolean jboolean 8位 byte jbyte 8位 char jchar 16位 short jshort 16位 int jnit 32位 long jlong 64位 float jfloat 32位 double jdouble 64位 ...

TLuffy的博客 3156

USB之ch376s数据手册

         最近师兄交给我一个项目,虽说刚学嵌入式起步,但上手一个项目怎说都是最好的快速学习方式。因为刚了解ch376s管理U盘的数据,所以先是看了ch376s的数据手册。那我就把数据手册直接放上来吧。。。。      1、概述 CH376 是文件管理控制芯片,用于单片机系统读写 U 盘或者 SD 卡中的文件。 CH376 支持 USB 设备方式和 USB 主机方式,并且内置了 USB 通...

iBGG的博客 6002

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

jbytearray转c++byte数组 C代码  jbyte * arrayBody = env->GetByteArrayElements(data,0);   jsize theArrayLengthJ = env->GetArrayLength(data);   BYTE * starter = (BYTE *)arrayBody;   jbyteArray 转 c++中

无为 1304

百元DIY手机荧光计:低成本荧光检测平台搭建与实战

荧光检测是一种基于物质受特定波长光激发后发射更长波长荧光的分析技术,其核心原理在于光与物质的相互作用。通过选择性激发与检测,该技术能实现对痕量物质的高灵敏度、高特异性定量分析,在生物医学、环境监测和食品安全等领域具有重要价值。传统荧光分光光度计虽精度高,但成本昂贵、体积庞大且操作复杂,限制了其在现场快检和普及教育中的应用。本文聚焦于如何利用智能手机的高性能摄像头和处理器,结合低成本光学滤光片和LED光源,构建一个便携、经济的DIY荧光检测平台。该方案通过简化光路设计,采用带通滤光片进行波长选择,并利用图像处

weixin_34194829的博客 304

python:numpy分享(保姆级教程)

创建数组:array和ndarray、rand()、randn()、arange()、randint()、uniform()astype()基础函数:ceil()、floor()、rint()、argmax()、argmin()、cumsum()、cumprod()numpy 是数据分析必不可少的第三方库,具有高性能的特点,多用于做数组分析。内置函数:ceil()、floor()、rint()主要用于数组计算,支持多维数组。array和ndarray。比较函数:all、any。去重函数:unique。

sulin123123的博客 1728

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

jbytearray转c++byte数组  C代码   jbyte * arrayBody = env->GetByteArrayElements(data,0);    jsize theArrayLengthJ = env->GetArrayLength(data);    BYTE * starter = (BYTE *)arrayBody;   

iie_libi的博客 805

【backtrader保姆级教学】投资组合回测

method1:探索投资组合的最有方案,使用蒙特卡洛模拟Markowitz模型。# 提取最小波动组合对应的权重, 并转换成Numpy数组。# 绘制收益-标准差的散点图,并用颜色描绘夏普比率。# 在收益-风险散点图中突出风险最小的点。:param any_day: 任意日期。# 将该点坐标显示在图中并保留四位小数。password = “替换密码”# 找到标准差最小数据的索引值。user = “替换账号”# 计算GMV投资组合收益。# 计算每项资产的夏普比率。# 设置无风险回报率为0。

weixin_38132951的博客 2314
上一篇: java面试题-HashMap原理
下一篇: 回调函数
lxf310
博客等级 码龄17年 26粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值