android 4.0 Jni 字符转换GetStringUTFChars()函数的Bug
2012-10-25 18:35
363 查看
我们项目中,核心部分使用Jni编写,
其中将Java的String转为C的字符串,字符串的转换如下:
以前在Android 2.x时,一切正常。
升级到4.0后出现异常。
出错退出。
跟踪发现问题:程序中j_passwd 有时为 NULL,造成的。
我当时没处理 j_passwd 为null。
这是Android 4.0的Bug?
再看我的测试:
测试代码如下:
输出日志:
只有第一行 begin GetStrinUTFChars(NULL)...
没有测试后的日志 :无end GetStrinUTFChars(NULL)...
应用直接退出。
Java中Try catch 无法捕获。
JNI校验更严格了,GetStrinUTFChars(NULL)会直接退出。也不是什么好事。
注意:转换函数GetStringUTFChars()不要将NULL传入。
其中将Java的String转为C的字符串,字符串的转换如下:
const char const *p_passwd = (*env)->GetStringUTFChars(env, j_passwd, NULL);
以前在Android 2.x时,一切正常。
升级到4.0后出现异常。
出错退出。
跟踪发现问题:程序中j_passwd 有时为 NULL,造成的。
我当时没处理 j_passwd 为null。
这是Android 4.0的Bug?
再看我的测试:
测试代码如下:
//test LOGI("begin GetStrinUTFChars(NULL)..."); const char const *p_char = (*env)->GetStringUTFChars(env, NULL, 0); LOGI("end GetStrinUTFChars(NULL)..."); //endtest
输出日志:
10-25 18:51:06.440: I/EbenTest16245): begin GetStrinUTFChars(NULL)... 10-25 18:51:06.440: W/dalvikvm(16245): JNI WARNING: received null jstring 10-25 18:51:06.440: W/dalvikvm(16245): in Lcn/hpc/test;.testString:(Ljava/lang/String;)I (GetStringUTFChars) 10-25 18:51:06.440: I/dalvikvm(16245): "main" prio=5 tid=1 NATIVE 10-25 18:51:06.440: I/dalvikvm(16245): | group="main" sCount=0 dsCount=0 obj=0x2b51f460 self=0x1d22b80 10-25 18:51:06.440: I/dalvikvm(16245): | sysTid=16245 nice=0 sched=0/0 cgrp=default handle=716903784 10-25 18:51:06.440: I/dalvikvm(16245): | schedstat=( 0 0 0 ) utm=3 stm=2 core=1 10-25 18:59:10.075: E/dalvikvm(16645): VM aborting 10-25 18:59:10.075: A/libc(16645): Fatal signal 11 (SIGSEGV) at 0xdeadd00d (code=1)
只有第一行 begin GetStrinUTFChars(NULL)...
没有测试后的日志 :无end GetStrinUTFChars(NULL)...
应用直接退出。
Java中Try catch 无法捕获。
JNI校验更严格了,GetStrinUTFChars(NULL)会直接退出。也不是什么好事。
注意:转换函数GetStringUTFChars()不要将NULL传入。
相关文章推荐
- JNI ERROR (app bug): attempt to use stale local reference 0x31900019(Android ICS(4.0+) JNI局部应用的变化)
- JNI ERROR (app bug): attempt to use stale local reference 0x31900019(Android ICS(4.0+) JNI局部应用的变化)
- Cocos2d-x 3.0 JNI BUG 修复。(Android 如何创建一个线程 延迟执行函数 创建一个随机数)
- 利用JNI技术在Android中调用C++形式的OpenGL ES 2.0函数
- Android jni GetFieldID 和 GetMethodID 函数的说明
- Android 从 JNI 中传入 UTF8 的字符到 Java
- php全角字符转换为半角函数
- android开发过程中将json日期字符串,转换成JAVA中Date类型格式化字符串
- mb_convert_encoding 函数的使用 转换字符编码
- android 按照拼音模糊查询中如何把字符转换成拼音
- [译]Android冰淇淋三明治ICS(4.0+)JNI局部引用的变化
- 写函数的时候要注意字符间的转换
- 《C++标准函数库》中说的有三个函数可以将字符串的内容转换为字符数组和C—string (CString、char*、String三种类型互换)
- P122.6(定义函数up(ch),如字符变量ch是小写字母就转换成大写字母并通过up返回,否则字符up不改变)
- AndroidICS(4.0+)JNI局部引用的变化
- eclipse android开发环境 bug CDT包含路径名无法修改(JNI开发使用)
- 利用JNI技术在Android中调用C++形式的OpenGL ES 2.0函数
- android jni开发 把一段java代码转换成c++方式调用
- php ucwords() 函数将字符串中每个单词的首字符转换为大写(实现代码)
- Android jni/ndk编程二:jni数据类型转换(primitive,String,array)