`
absolute
  • 浏览: 188120 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

JNI中jstring 和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代码:

 

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, "<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);
}
分享到:
评论
1 楼 fresty 2012-06-19  
http://stackoverflow.com/questions/4181934/jni-converting-jstring-to-char
const char *nativeString = (*env)->GetStringUTFChars(env, javaString, 0);    
// use your string    
(*env)->ReleaseStringUTFChars(env, javaString, nativeString);

相关推荐

    char *转 jstring

    C++调用java java调用C++ 字符串参数传递 类型的转换

    android jni jstring

    这是我写的android jni jstring的demo,共享一下

    Android jni调试打印char阵列的实例详解

    主要介绍了Android jni调试打印char阵列的实例详解的相关资料,通过此文希望能帮助到大家实现这样的功能,需要的朋友可以参考下

    JNI文档资料源码_2020_01_28_2.zip

    【Android NDK 开发】JNI 方法解析 ( 字符串数组参数传递 | 字符串遍历 | 类型强转 | Java 字符串与 C 字符串转换 | 字符串释放 ) 博客地址 : https://hanshuliang.blog.csdn.net/article/details/104103097 I...

    jni数据类型转换

    jni数据类型转换例程 1. java向native传递常用基本数据类型 和字符串类型 2. java向native传递数组类型 3. java向native传递自定义java对象 4. java向native传递任意java对象(以向native传递ArrayList为例) 5....

    libiconv.lib and iconv.h for win64

    编码转换的64包,我是在jni封装ctp时使用这个传中文可以不乱码 int code_convert(const char *from_charset, const char *to_charset, char *inbuf, size_t inlen, char *outbuf, size_t outlen) { iconv_t cd; ...

    jni.zip jni编译jni下载

    学习JNI编译时,缺少的jni.h和jni_md.h头文件,Java调用C和C++函数时的JNI使用区别: 注意:jni.h头文件中对于***.c & ***.cpp采用不同的定义

    jni使用string相互调用

    jni使用string相互调用 Java 传递 String 给C C 传递 jstring 给 Java

    使用JNI进行JAVA和C++之间的互调

    在VS2013中使用JNI进行JAVA和C++之间的互调,这两个文件只是项目中的一部分,仅供参考

    LINUX调用JNI动态库.txt

    LINUX调用JNI动态库.txt LINUX调用JNI动态库.txt

    ffmpeg编译的android可用的so文件,多个版本

    jstring string=(*env)-&gt;GetObjectArrayElement(env,cmdline,i); const char* tmp=(*env)-&gt;GetStringUTFChars(env,string,0); argv[i]=(char*)malloc(sizeof(char)*1024); strcpy(argv[i],tmp); } ffmpeg...

    jni开发demo:通过jni将一张彩色图片转换为黑白图片

    通过jni将一张彩色图片转换为黑白图片,通过这个demo,可以深入了解jni的应用

    解决JNI中文乱码

    解决JNI中文乱码,

    JNI接口开发

    native方法中实现JNI_OnLoad,返回JNI的版本号;如果native不实现,则由虚拟机生成默认实现。在加载本地库时调用 b) 静态绑定时,运行时按照特定规则查找对应的方法 2. 参数转换 a) 将java参数类型转换为jni提供的...

    jni4net C# java 相互调用

    jni4net 用于想实现 C#调用java或者java调用C#代码的项目。从介绍上来看比IKVM强大。

    JNI的两个头文件jni.h和jni_md.h

    JNI的两个头文件jni.h和jni_md.h,提供需要的人下载!!!!!

    JNI完全技术手册 带完整书签

    Chap1:JNI完全手册... 3 Chap2:JNI-百度百科... 11 Chap 3:javah命令帮助信息...... Chap 4:用javah产生一个.h文件...2. 访问Java类的域和方法... 156 3. 在native方法中使用用户定义的类... 157 4. 异常处理... 158

    3.jni_c++调用java中的方法

    jni_c++调用java中的方法 文档中包含(c++与js互相调用的实现)

    jni C结构体转JAVA实体类

    目前支持基础数据类型int、long、foloat、double、const char *、bool的转换,也支持将数组装换为JAVA中的ArrayList。目前有个难点是将枚举类型直接转换为JAVA中的枚举,这个目前还搞不定,如果有朋友知道怎么搞,...

Global site tag (gtag.js) - Google Analytics