jni和java之间字符串的转换方法。

  C的实现:

  JNIEXPORT jstring JNICALL Java_Android123_CwjC (JNIEnv *env, jobject obj, jstring string)

  {

   char szBuffer[255];

   return (*env)->NewStringUTF(env, szBuffer);

  }

  C++的实现:

  JNIEXPORT jstring JNICALL Java_Android123_CwjCpp (JNIEnv *env, jobject obj, jstring string)

  {

  const char *strUTF = env->GetStringUTFChars(string, 0);

  char szBuffer[255];

  strcpy(szBuffer, strUTF);

  env->ReleaseStringUTFChars(string, strUTF);

  return env->NewStringUTF(szBuffer);

  }

java中string与byte[]的转换

1.string 转 byte[]

byte[] midbytes=isoString.getBytes("UTF8");

//为UTF8编码

byte[] isoret = srt2.getBytes("ISO-8859-1");

//为ISO-8859-1编码

其中ISO-8859-1为单字节的编码

2.byte[]转string

String isoString = new String(bytes,"ISO-8859-1");

String srt2=new String(midbytes,"UTF-8");

//jbytearray转c++byte数组

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

3

jsize theArrayLengthJ = env->GetArrayLength(data);

4

BYTE * starter = (BYTE *)arrayBody;

1

//jbyteArray 转 c++中的BYTE[]

//jbytearray array

jbyte * olddata = (jbyte*)env->GetByteArrayElements(array, 0);

jsize  oldsize = env->GetArrayLength(array);

BYTE* bytearr = (BYTE*)olddata;

int len = (int)oldsize;

//C++中的BYTE[]转jbyteArray

//nOutSize是BYTE数组的长度 BYTE pData[]

jbyte *by = (jbyte*)pData;

jbyteArray jarray = env->NewByteArray(nOutSize);

env->SetByteArrayRegin(jarray, 0, nOutSize, by);

//jbyteArray 转 char *

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

//char* 转jstring

jstring WindowsTojstring(JNIEnv* env, char* str_tmp)

{

jstring rtn=0;

int slen = (int)strlen(str_tmp);

unsigned short* buffer=0;

if(slen == 0)

{

rtn = env->NewStringUTF(str_tmp);

}

11

else

{

int length = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)str_tmp, slen, NULL, 0);

buffer = (unsigned short*)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);

}

return rtn;

}

1

//jstring 转 char* 或者 const char*

// jstring str

const char *key = env->GetStringUTFChars(str, 0);

//jboolean isOffer

jsClient->modify(key, isOffer);

//需要释放,否则容易内存泄露

env->ReleaseStringUTFChars(str, key);

//JNI 返回 jbyteArray

JNIEXPORT jbyteArray JNICALL Java_Test_getByteArray(JNIEnv *env, jobject obj)

{

jbyteArray firstMacArray = env->NewByteArray( 6 );

jbyte *bytes = env->GetByteArrayElements( firstMacArray, 0);

for ( int i = 0; i < sizeof( pAdapterInfo->Address ); i++ )

{

bytes[ i ] = pAdapterInfo->Address[ i ];

}

env->SetByteArrayRegion(firstMacArray, 0, 6, bytes );

return firstMacArray;

}

//jstring to char*

char* jstringTostring(JNIEnv* env, jstring jstr)

{

char* rtn = NULL;

jclass clsstring = env->FindClass("java/lang/String");

jstring strencode = env->NewStringUTF("utf-8");

jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B");

jbyteArray barr= (jbyteArray)env->CallObjectMethod(jstr, mid, strencode);

jsize alen = 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);

return rtn;

}

char* to jstring

jstring stoJstring(JNIEnv* env, const char* pat)

{

jclass strClass = env->FindClass("Ljava/lang/String;");

jmethodID ctorID = env->GetMethodID(strClass, "", "([BLjava/lang/String;)V");

jbyteArray bytes = env->NewByteArray(strlen(pat));

env->SetByteArrayRegion(bytes, 0, strlen(pat), (jbyte*)pat);

jstring encoding = env->NewStringUTF("utf-8");

return (jstring)env->NewObject(strClass, ctorID, bytes, encoding);

}

//将jstring类型转换成windows类型

char* jstringToWindows( JNIEnv *env, jstring jstr )

{

int length = (env)->GetStringLength(jstr );

const jchar* jcstr = (env)->GetStringChars(jstr, 0 );

char* rtn = (char*)malloc( length*2+1 );

int size = 0;

size = WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)jcstr, length, rtn,(length*2+1), NULL, NULL );

if( size <= 0 )

return NULL;

(env)->ReleaseStringChars(jstr, jcstr );

rtn[size] = 0;

return rtn;

}

//将windows类型转换成jstring类型

jstring WindowsTojstring( JNIEnv* env, char* str )

{

jstring rtn = 0;

int slen = strlen(str);

unsigned short * buffer = 0;

if( slen == 0 )

rtn = (env)->NewStringUTF(str );

else

{

int length = MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, NULL, 0 );

buffer = (unsigned short *)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 );

return rtn;

}

//从传进来的对象中取出byte[]

jfieldID byteData = (env)->GetFieldID(clazz,"bData","[B");

jbyteArray pDataIn = (jbyteArray) (env)->GetObjectField(objDataIn, byteData);

jsize theArrayLeng = env->GetArrayLength(pDataIn);

//byte[]转为BYTE[]

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

BYTE * jDataIn = (BYTE *)arrayBody;

JNI开发交流 C/C++,JAVA,android,linux/unix  QQ群:25093009

//将BYTE数组转为jarray

jbyte* byte = (jbyte*)jDataOut;

jbyteArray jarray = env->NewByteArray(theArrayLeng);

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

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

(env)->SetObjectField(objDataIn,byteData,jarray);

(env)->SetIntField(objDataIn,pDataInLen,jDataInLen);

(env)->ReleaseByteArrayElements(pDataIn, arrayBody, 0);

jni和java之间字符串的转换相关推荐

  1. java 将字符串集合转换成字符串并以顿号隔开

    要将字符串集合转换成以顿号隔开的字符串,可以使用 Java 的 StringJoiner 类. 例如,假设你有一个字符串集合,你想要将它们转换成一个字符串,并以顿号隔开,你可以这样做: import ...

  2. android jni与java之间数据传输时怎么转换

    1.c中的jstring数据类型就是java传入的String对象,经过jni函数的转化就能成为c的char*. Java 类型 本地c类型 说明 boolean jboolean 无符号 8 位 b ...

  3. java对字符串编码转换_处理字符串编码转换java类详解

    该字符串处理类包括将ISO-8859-1编码的字符串转换成GBK编码 .对输入的字符串进行一次编码转换,防止SQL注入和验证URL地址是否存在的方法. 字符串处理类(编码转化.SQL注入.URL) i ...

  4. 用JAVA实现字符串大小写转换

    题目描述 输入任意个字符串,将其中的小写字母变为大写,大写字母变为小写,其他字符不用处理: 输入描述: 任意字符串:abcd12#%XYZ 输出描述: 输出字符串:ABCD12#%xyz 示例1: 输 ...

  5. java英文字符串大小写转换 必须使用_【Java基础】之字符串大小写转换不利用API....

    public class UpStr { static String str = "AbcDeFdDSfgdsadeADFSAFCfdsa"; public String tran ...

  6. Android NDK开发之旅(3): 详解JNI数据类型与C/C++、Java之间的互调

    Android NDK开发之旅(3):详解JNI数据类型与C/C++.Java之间的互调 (码字不易,转载请声明出处:http://blog.csdn.net/andrexpert/article/d ...

  7. Json——使用Json jar包实现Json字符串与Java对象或集合之间的互相转换

    总结一下利用Json相关jar包实现Java对象和集合与Json字符串之间的互相转换: 1.创建的User类: package com.ghj.packageofdomain;public class ...

  8. Java对于字符串的处理【String和int之间的转换、字符串拼接、字符串获取长度、字符串大小写转换、字符串去空格、字符串分割、字符串替换、字符串提取、字符串比较、字符串查找】

    文章目录 String字符串 和 整型int 的相互转换 String转化为int int 转换为 String 字符串拼接 使用连接运算符 "+" 使用 concat() 方法 ...

  9. jni 传递字符串到java_Android JNI开发-java与c++其间的中文字符串传递

    Android JNI开发---java与c++之间的中文字符串传递 最近在做一个Android电子词典,其中在从词库中读取词条时,用到了jni---java调用c++;在java代码里调用本地方法时 ...

最新文章

  1. 20亿参数,大型视觉Transformer来了,刷新ImageNet Top1,All you need is money!
  2. JVM调优:CMS使用的算法
  3. Redis DeskTop Manager 使用教程
  4. 演练 五家限购专卖店
  5. pxe dhcp offer之后没有_秒懂DHCP是什么
  6. c语言中闰年的流程图_c语言(算法流程图).ppt
  7. uboot中bss的理解
  8. php 字符显示不出来,ps文字显示不出来怎么办?
  9. 分布式技术(6) 后端接口设计方案
  10. 中南大学FYT机器人战队超级电容开发经验记录及分享(ROBOMASTER)
  11. 全球及中国智能家居设备市场竞争态势与投资策略建议报告2022版
  12. 数据库MySQL错误2058_SQLyog连接MySQL8.0报2058错误的完美解决方法
  13. 使用虚拟机备份软件备份XCP-ng虚拟机
  14. 01.JS基础_前端的语法(4)
  15. 质量、质量要求、检验、验证和确认
  16. 字符串——OKR-Periods of Words(kmp求最短相同前后缀或者说求最长循环节)
  17. 生物信息中的Markov链
  18. 基于PCA的TE过程故障诊断(matlab)
  19. vr性能测试软件,SteamVR性能测试工具
  20. 一文全面了解光纤连接器

热门文章

  1. jedis_通过Jedis API使用排序集
  2. 计算机存储器与寄存器的区别,存储器和寄存器区别
  3. 皮一皮:高考考了 692 分想当程序员的女生
  4. 因未发项目奖金,一名程序员决定删代码泄愤
  5. SpringBoot + Mybatis + Druid + PageHelper 实现多数据源分页
  6. Spring Framework 5.2.5 发布,增加对 Java 14 的支持
  7. 关于 JShell,开发人员需要知道的10件事情
  8. 缓存穿透、缓存并发、热点缓存之最佳招式
  9. 协议地址结构_通信之路——用最简洁的文字告诉你互联网协议TCP/IP
  10. Linux中autoduck批量对接,求助:关于autodock模拟分子对接