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

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->GetByteArrayElements(strIn, 0);
3 jsize  oldsize = env->GetArrayLength(strIn);
4 BYTE* bytearr = (BYTE*)olddata;
5 int len = (int)oldsize;  

C++中的BYTE[]转jbyteArray

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 *

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

char* 转jstring

  1.  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*

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

 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*

 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

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类型

 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类型

 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[]

1 jfieldID byteData = (env)->GetFieldID(clazz,"bData","[B");
2 jbyteArray pDataIn = (jbyteArray) (env)->GetObjectField(objDataIn, byteData);
3 jsize theArrayLeng = env->GetArrayLength(pDataIn);  

//byte[]转为BYTE[]

1 jbyte * arrayBody = env->GetByteArrayElements(pDataIn,0);
2 BYTE * jDataIn = (BYTE *)arrayBody;   

//将BYTE数组转为jarray

1 jbyte* byte = (jbyte*)jDataOut;
2 jbyteArray jarray = env->NewByteArray(theArrayLeng);
3 env->SetByteArrayRegion(jarray, 0, theArrayLeng, byte);  

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

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

原文地址:https://www.cnblogs.com/zl1991/p/9188736.html

时间: 2024-07-31 12:39:46

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

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

JNICC++C#Windows jbytearray转c++byte数组 C代码   [c] view plaincopy jbyte * arrayBody = env->GetByteArrayElements(data,0); jsize theArrayLengthJ = env->GetArrayLength(data); BYTE * starter = (BYTE *)arrayBody;jbyteArray 转 c++中的BYTE[] C代码   [c] view plain

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("---------------------"); // 过滤