最近在学习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;
}

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);
}


JNI中String和char之间的相互转换相关推荐

  1. 类型转换:String与char[ ]之间的相互转换 ——java

    类型转换: 1.String-->char[ ] 通过:toCharArry() 方法 String strs = "我爱你,朋友";char[] ch = strs.toC ...

  2. PInvoke复习之深入理解char*与wchar_t*与string以及wstring之间的相互转换

    本篇文章是对c++中的char*与wchar_t*与string以及wstring之间的相互转换进行了详细的分析介绍,需要的朋友参考下 #ifndef USE_H_ #define USE_H_ #i ...

  3. string、char *、char []之间的相互转换

    最近工作中遇到了string.char *.char []之间的相互转换,今天终于抽出时间将他们之间的转换记录下来,使用的是CodeBlocks软件,编译器为GNU GCC compiler,下面看代 ...

  4. MFC中的CString.Format及CString,string,char*之间的转换

    1.CString.Format的使用:https://blog.csdn.net/wangkaishou/article/details/5846152 2.CString,string,char* ...

  5. C++中string、char *、char[]的转换

    C++中string.char *.char[]的转换 头段时间有人问过我这个问题,可是我一点头绪都没有,直接说不会.现在从网上找了点资料,看了看,知道点东西了. 一.string转char*. 主要 ...

  6. java中int与char之间的互相转化

    引言 在介绍java中int与char之间的互相转化之前,让我们先简单的回顾一些会涉及到的知识. 数据类型 在介绍int与char的转换之前,我们先来回顾一下java中的基本数据类型: 类型 大小 包 ...

  7. Arduino 中String 与char *,char[]之间赋值

    只是简单实现String与char *,char[]之间的赋值: 其中: xch2 = char1;       //可以正常赋值 但是不能反过来赋值: char3 = xch1;   //会出错 同 ...

  8. C++中string、char[]、char*之间的转换

    目录 1.char[].char*转string 2.string转char*.char[] 1.char[].char*转string char[].插入*转string比较简单,直接赋值即可进行转 ...

  9. Java中String与char数组相互转换

    java中对string的操作很多时候不如对char[]操作的方便,所以介绍一些String字符串和char[]互换的方法: String直接转char[] 使用String.toCharArray( ...

最新文章

  1. DeepMind 的新强化学习系统,是迈向通用人工智能的一步吗?
  2. 语义分割中的深度学习方法全解:从FCN、SegNet到各版本DeepLab
  3. python【数据结构与算法】KMP和扩展算法
  4. gdb加载python_gdb加载python脚本的方法
  5. 2020 我的C++学习之路 C++PrimerPlus第六章课后习题
  6. IOC容器特性注入第一篇:程序集反射查找
  7. 【推荐系统】推荐系统冷启动问题
  8. 将终结点图添加到你的ASP.NET Core应用程序中
  9. 用C实现任意一年的日历
  10. svn 覆盖更新_使用SVN钩子强制提交日志和限制提交文件类型
  11. 编码器-解码器网络:神经翻译模型详解
  12. golang 读取Excel 或者map字符型返回结构体数组
  13. jdk和jre有什么区别?
  14. 计算理论导论第1章答案 Michael Sipser
  15. 禁用Insert按键
  16. 【Day7.1】张掖七彩丹霞看日出
  17. msf之msfvenom的使用—使用Kali渗透工具生成远控木马
  18. Cocos2d-x游戏开发实例详解3:无限滚动地图
  19. 毕业生社保、档案和户口详解 1
  20. centos安装gcc的方法

热门文章

  1. pb打印选择页数_要想打印不卡纸,卡纸原因要了解
  2. proteus仿真micropython_【雕爷学编程】MicroPython动手做(04)——零基础学MaixPy之尝试运行...
  3. MongoDB 4.0 事务实现解析
  4. 【BZOJ】4430: [Nwerc2015]Guessing Camels赌骆驼
  5. python学习:函数传参数
  6. 浅谈并发与并行(一)
  7. LVS三种工作模式介绍对比和十种调度算法介绍
  8. GARFIELD@07-12-2005 DILBERT
  9. OpenCv 009---色彩空间与色彩空间转换
  10. 补psp进度(11月4号-9号)