string和char*转换
来源:互联网 发布:mac 安装wget命令 编辑:程序博客网 时间:2024/04/30 08:14
最近在学习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代码:
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* 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, "<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);
}
{
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);
}
0 0
- string和char*转换
- string 和char * char[]之间的转换
- string char *和char[] 之间的转换
- string const char *和char *的转换
- char,string和CString转换
- char[] 转换为 string 和 string 转换为 char[]
- const char *,char * ,string,char []之间的关系和转换
- string,char*,char[]转换
- String-->char[],char[]-->String转换
- char* string String^转换
- string 和const char*和char*之间的转换
- char*和string, CString的转换
- C# char 和string之间转换
- C++中char *和string的转换
- string和char数组之间的转换
- IOS下string和char转换
- 关于string和char的转换等
- char*,string和CString之间的转换
- docker同步镜像报错Network timed out while trying to connect
- index_merge引发的死锁排查
- Android ViewDragHelper使用总结
- freeimage例子资料整理
- CC2640R2F之IAR下载、安装及注册
- string和char*转换
- 01
- 详解与重构hyman《Android SurfaceView实战 打造抽奖转盘》
- 02
- freeimage边缘检测
- CentOS下Mysql数据库的安装与配置
- 03-css
- HTML基本标签属性 一
- JAVA学习笔记(一)