jni和java之间字符串的转换
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之间字符串的转换相关推荐
- java 将字符串集合转换成字符串并以顿号隔开
要将字符串集合转换成以顿号隔开的字符串,可以使用 Java 的 StringJoiner 类. 例如,假设你有一个字符串集合,你想要将它们转换成一个字符串,并以顿号隔开,你可以这样做: import ...
- android jni与java之间数据传输时怎么转换
1.c中的jstring数据类型就是java传入的String对象,经过jni函数的转化就能成为c的char*. Java 类型 本地c类型 说明 boolean jboolean 无符号 8 位 b ...
- java对字符串编码转换_处理字符串编码转换java类详解
该字符串处理类包括将ISO-8859-1编码的字符串转换成GBK编码 .对输入的字符串进行一次编码转换,防止SQL注入和验证URL地址是否存在的方法. 字符串处理类(编码转化.SQL注入.URL) i ...
- 用JAVA实现字符串大小写转换
题目描述 输入任意个字符串,将其中的小写字母变为大写,大写字母变为小写,其他字符不用处理: 输入描述: 任意字符串:abcd12#%XYZ 输出描述: 输出字符串:ABCD12#%xyz 示例1: 输 ...
- java英文字符串大小写转换 必须使用_【Java基础】之字符串大小写转换不利用API....
public class UpStr { static String str = "AbcDeFdDSfgdsadeADFSAFCfdsa"; public String tran ...
- Android NDK开发之旅(3): 详解JNI数据类型与C/C++、Java之间的互调
Android NDK开发之旅(3):详解JNI数据类型与C/C++.Java之间的互调 (码字不易,转载请声明出处:http://blog.csdn.net/andrexpert/article/d ...
- Json——使用Json jar包实现Json字符串与Java对象或集合之间的互相转换
总结一下利用Json相关jar包实现Java对象和集合与Json字符串之间的互相转换: 1.创建的User类: package com.ghj.packageofdomain;public class ...
- Java对于字符串的处理【String和int之间的转换、字符串拼接、字符串获取长度、字符串大小写转换、字符串去空格、字符串分割、字符串替换、字符串提取、字符串比较、字符串查找】
文章目录 String字符串 和 整型int 的相互转换 String转化为int int 转换为 String 字符串拼接 使用连接运算符 "+" 使用 concat() 方法 ...
- jni 传递字符串到java_Android JNI开发-java与c++其间的中文字符串传递
Android JNI开发---java与c++之间的中文字符串传递 最近在做一个Android电子词典,其中在从词库中读取词条时,用到了jni---java调用c++;在java代码里调用本地方法时 ...
最新文章
- 20亿参数,大型视觉Transformer来了,刷新ImageNet Top1,All you need is money!
- JVM调优:CMS使用的算法
- Redis DeskTop Manager 使用教程
- 演练 五家限购专卖店
- pxe dhcp offer之后没有_秒懂DHCP是什么
- c语言中闰年的流程图_c语言(算法流程图).ppt
- uboot中bss的理解
- php 字符显示不出来,ps文字显示不出来怎么办?
- 分布式技术(6) 后端接口设计方案
- 中南大学FYT机器人战队超级电容开发经验记录及分享(ROBOMASTER)
- 全球及中国智能家居设备市场竞争态势与投资策略建议报告2022版
- 数据库MySQL错误2058_SQLyog连接MySQL8.0报2058错误的完美解决方法
- 使用虚拟机备份软件备份XCP-ng虚拟机
- 01.JS基础_前端的语法(4)
- 质量、质量要求、检验、验证和确认
- 字符串——OKR-Periods of Words(kmp求最短相同前后缀或者说求最长循环节)
- 生物信息中的Markov链
- 基于PCA的TE过程故障诊断(matlab)
- vr性能测试软件,SteamVR性能测试工具
- 一文全面了解光纤连接器
热门文章
- jedis_通过Jedis API使用排序集
- 计算机存储器与寄存器的区别,存储器和寄存器区别
- 皮一皮:高考考了 692 分想当程序员的女生
- 因未发项目奖金,一名程序员决定删代码泄愤
- SpringBoot + Mybatis + Druid + PageHelper 实现多数据源分页
- Spring Framework 5.2.5 发布,增加对 Java 14 的支持
- 关于 JShell,开发人员需要知道的10件事情
- 缓存穿透、缓存并发、热点缓存之最佳招式
- 协议地址结构_通信之路——用最简洁的文字告诉你互联网协议TCP/IP
- Linux中autoduck批量对接,求助:关于autodock模拟分子对接