JNI中String和char之间的相互转换
最近在学习NDK下的opengl es2.0开发,看过很多demos都是直接用一串字符串把shader代码写死的。并没有用一个单独的shader脚本语言文件。glShaderSource()这个方法需要的shader脚本也是通过一个char** 传入的。
而且在NDK下面也没看到有什么方式可以直接调用android工程里面的res资源文件。(目前是没发现才刚开始学)
所以我就想把shader脚本文件放在android工程的res资源目录里面,在java端读出来然后传入到jni里面去。
在java中由于是unicode编码,无论是英文字母还是汉字每个字符都是占用2个字节。但是在jni中的字符时utf-8编码,每个字符不是等长的。所以在java和jni调用的时候要注意这个问题。
下面是我在网上找到的一些把jstring和char*转换的一些sample代码:
/**
* 工具方法,把java的string类型转化成 c的str
*/
char* Jstring2CStr(JNIEnv* env, jstring jstr) {
char* rtn = NULL;
jclass clsstring = (*env)->FindClass(env, "java/lang/String");
jstring strencode = (*env)->NewStringUTF(env, "GB2312");
jmethodID mid = (*env)->GetMethodID(env, clsstring, "getBytes",
"(Ljava/lang/String;)[B");
jbyteArray barr = (jbyteArray) (*env)->CallObjectMethod(env, jstr, mid,
strencode); // String .getByte("GB2312");
jsize alen = (*env)->GetArrayLength(env, barr);
jbyte* ba = (*env)->GetByteArrayElements(env, barr, JNI_FALSE);
if (alen > 0) {
rtn = (char*) malloc(alen + 1); //"\0"
memcpy(rtn, ba, alen);
rtn[alen] = '\0';
}
(*env)->ReleaseByteArrayElements(env, barr, ba, 0); //释放内存
return rtn;
}
{
jclass strClass = env->FindClass("Ljava/lang/String;");
jmethodID ctorID = env->GetMethodID(strClass, "<init>", "([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);
}
JNI中String和char之间的相互转换相关推荐
- 类型转换:String与char[ ]之间的相互转换 ——java
类型转换: 1.String-->char[ ] 通过:toCharArry() 方法 String strs = "我爱你,朋友";char[] ch = strs.toC ...
- PInvoke复习之深入理解char*与wchar_t*与string以及wstring之间的相互转换
本篇文章是对c++中的char*与wchar_t*与string以及wstring之间的相互转换进行了详细的分析介绍,需要的朋友参考下 #ifndef USE_H_ #define USE_H_ #i ...
- string、char *、char []之间的相互转换
最近工作中遇到了string.char *.char []之间的相互转换,今天终于抽出时间将他们之间的转换记录下来,使用的是CodeBlocks软件,编译器为GNU GCC compiler,下面看代 ...
- MFC中的CString.Format及CString,string,char*之间的转换
1.CString.Format的使用:https://blog.csdn.net/wangkaishou/article/details/5846152 2.CString,string,char* ...
- C++中string、char *、char[]的转换
C++中string.char *.char[]的转换 头段时间有人问过我这个问题,可是我一点头绪都没有,直接说不会.现在从网上找了点资料,看了看,知道点东西了. 一.string转char*. 主要 ...
- java中int与char之间的互相转化
引言 在介绍java中int与char之间的互相转化之前,让我们先简单的回顾一些会涉及到的知识. 数据类型 在介绍int与char的转换之前,我们先来回顾一下java中的基本数据类型: 类型 大小 包 ...
- Arduino 中String 与char *,char[]之间赋值
只是简单实现String与char *,char[]之间的赋值: 其中: xch2 = char1; //可以正常赋值 但是不能反过来赋值: char3 = xch1; //会出错 同 ...
- C++中string、char[]、char*之间的转换
目录 1.char[].char*转string 2.string转char*.char[] 1.char[].char*转string char[].插入*转string比较简单,直接赋值即可进行转 ...
- Java中String与char数组相互转换
java中对string的操作很多时候不如对char[]操作的方便,所以介绍一些String字符串和char[]互换的方法: String直接转char[] 使用String.toCharArray( ...
最新文章
- DeepMind 的新强化学习系统,是迈向通用人工智能的一步吗?
- 语义分割中的深度学习方法全解:从FCN、SegNet到各版本DeepLab
- python【数据结构与算法】KMP和扩展算法
- gdb加载python_gdb加载python脚本的方法
- 2020 我的C++学习之路 C++PrimerPlus第六章课后习题
- IOC容器特性注入第一篇:程序集反射查找
- 【推荐系统】推荐系统冷启动问题
- 将终结点图添加到你的ASP.NET Core应用程序中
- 用C实现任意一年的日历
- svn 覆盖更新_使用SVN钩子强制提交日志和限制提交文件类型
- 编码器-解码器网络:神经翻译模型详解
- golang 读取Excel 或者map字符型返回结构体数组
- jdk和jre有什么区别?
- 计算理论导论第1章答案 Michael Sipser
- 禁用Insert按键
- 【Day7.1】张掖七彩丹霞看日出
- msf之msfvenom的使用—使用Kali渗透工具生成远控木马
- Cocos2d-x游戏开发实例详解3:无限滚动地图
- 毕业生社保、档案和户口详解 1
- centos安装gcc的方法
热门文章
- pb打印选择页数_要想打印不卡纸,卡纸原因要了解
- proteus仿真micropython_【雕爷学编程】MicroPython动手做(04)——零基础学MaixPy之尝试运行...
- MongoDB 4.0 事务实现解析
- 【BZOJ】4430: [Nwerc2015]Guessing Camels赌骆驼
- python学习:函数传参数
- 浅谈并发与并行(一)
- LVS三种工作模式介绍对比和十种调度算法介绍
- GARFIELD@07-12-2005 DILBERT
- OpenCv 009---色彩空间与色彩空间转换
- 补psp进度(11月4号-9号)