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

JNICC++C#Windows

jbytearray转c++byte数组

C代码  

[c] view plaincopy

  1. jbyte * arrayBody = env->GetByteArrayElements(data,0);

  2. jsize theArrayLengthJ = env->GetArrayLength(data);

  3. BYTE * starter = (BYTE *)arrayBody;


jbyteArray
转 c++中的BYTE[]

C代码  

[c] view plaincopy

  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代码  

[c] view plaincopy

  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代码  

[c] view plaincopy

  1. char* data = (char*)env->GetByteArrayElements(strIn, 0);


char*
转jstring

C代码  

[c] view plaincopy

  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代码  

[c] view plaincopy

  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代码  

[c] view plaincopy

  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. env->SetByteArrayRegion(firstMacArray, 0, 6, bytes );

  11. return firstMacArray;

  12. }


//jstring to
char*

C代码  

[c] view plaincopy

  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代码  

[c] view plaincopy

  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代码  

[c] view plaincopy

  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代码  

[c] view plaincopy

  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. pszSTR1 = jstringTostring(env, jstr1);

  28. pszSTR2 = jstringTostring(env, jstr2);
  29. int nlen = sizeof(char)*(strlen(pszSTR1)+strlen(pszSTR2));

  30. pszResult = (char*)malloc(nlen);

  31. strcpy(pszResult, pszSTR1);

  32. strcat(pszResult, pszSTR2);
  33. jstring jstrRe = 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代码  

[c] view plaincopy

  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代码  

[c] view plaincopy

  1. jbyte * arrayBody = env->GetByteArrayElements(pDataIn,0);

  2. BYTE * jDataIn = (BYTE *)arrayBody;


//将BYTE数组转为jarray

C代码  

[c] view plaincopy

  1. jbyte* byte = (jbyte*)jDataOut;

  2. jbyteArray jarray = env->NewByteArray(theArrayLeng);

  3. env->SetByteArrayRegion(jarray, 0, theArrayLeng, byte);


//给每一个实例的变量付值

C代码  

[c] view plaincopy

  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

原文:http://blog.csdn.net/xuxinyl/article/details/6718780

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

时间: 2024-08-29 00:05:26

JNI的某些数组和字符串类型转换的相关文章

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

jbytearray转c++byte数组 1 jbyte * arrayBody = env->GetByteArrayElements(data,0); 2 jsize theArrayLengthJ = env->GetArrayLength(data); 3 BYTE * starter = (BYTE *)arrayBody; jbyteArray 转 c++中的BYTE[] 1 //jbytearray strIn 2 jbyte * olddata = (jbyte*)env-&g

java se学习(二)数组与字符串、数据类型转

一.数组与字符串特点 1.数组一旦初始化,其容量即限定 2.字符串一旦初始化,其长度是固定的,内容也是固定的,如果要改变值,只能放弃原来的内存空间,重新申请内存空间. 二. 数据类型转换的种类 java数据类型的转换一般分三种,分别是: (1). 简单数据类型之间的转换 (2). 字符串与其它数据类型的转换 (3). 其它实用数据类型转换 三. 简单数据类型之间的转换 在Java中整型.实型.字符型被视为简单数据类型,这些类型由低级到高级分别为 (byte,short,char)--int--l

数组、字符串、集合

数组与集合的转换.数组与字符串的转换 ========数组变集合 String[] arr = {"abc","cc","kkkk"}; //把数组变成list集合有什么好处? /* 可以使用集合的思想和方法来操作数组中的元素. 注意:将数组变成集合,不可以使用集合的增删方法. 因为数组的长度是固定. contains. get indexOf() subList(); 如果你增删.那么会产生UnsupportedOperationExcepti

数组转字符串(属性加单引号,逗号分隔)

数组转字符串(属性加单引号,逗号分隔) 数组转字符串 PHP 应用场景:SQL写操作应用插入表字段值: 数组 $data $data = array('张三','男','20',''安徽省合肥市 '); 转换如下: #join $str = " ' " . join("','", array_values($data) ) . " ' "; #str_replace $str = " ' ".str_replace( &quo

js中数组对象字符串的相互转换

对象-数组-字符串: 例如: var data = { user:"userName", pass:"12121" };//这是一个对象 如果要给这个data 对象追加一个属性就比如: new Date( ).getTime( );//获取当前时间到那个时间的时间间隔单位是毫秒: data.time = new Date( ).getTime( ); 此时data 里面就多了一个属性: time : " 获取到的那个毫秒数" 即: var dat

SQL写操作 设置内容 (数组转字符串)

SQL写操作 设置内容 (数组转字符串) SQL set内容 SQL操作数组转字符串 SQL写操作 set内容 (数组转字符串) [ 封装方法 ] function getSqlSet( $data ){ $Str = "";  foreach( $data as $k => $v ){  $Str.= $k."='".$v."',";  }  $Str = substr($Str,0,-1);  return $Str;  }  如执行i

linux基础学习第十三天(数组、字符串变量处理)

2016-08-22 授课内容: 数组 高级字符串操作 一.数组 变量:存储单个元素的内存空间 数组:存储多个元素的连续的内存空间,相当于多个变量的集合. 数组名和索引 索引:编号从0开始,属于数值索引 bash的数组支持稀疏格式(索引不连续) 1.声明数组: declare -a ARRAY_NAME(并非强制声明,但最好按规范声明) declare -A ARRAY_NAME: 关联数组 2.数组元素的赋值: (1) 一次只赋值一个元素: ARRAY_NAME[INDEX]=VALUE [1

Swift 数组、字符串、集合与字典详解

今天我们来看几个最基本的数据结构:数组,字符串,集合和字典. 数组 数组是最基本的数据结构.Swift编程语言中改变了以前Objective-C时代NSMutableArray和NSArray分开的做法,统一到了Array唯一的数据结构.下面是最基本的一些实现. 1 2 3 4 5 6 7 8 9 10 11 // 声明一个不可修改的数组 let nums = [1, 2, 3] let nums = [Int](count: 5, repeatedValue: 0) // 声明一个可以修改的数

js 数组,字符串,JSON,bind, Name

/** * Created by W.J.Chang on 2014/5/23. */ // 判读是否是数组的方法 console.log(Array.isArray(new Array)); console.log(Array.isArray([])); var arr = [1,2,3]; // 遍历方法 arr.forEach(function (v){ console.log(v); }); console.log("---------------------"); // 过滤