Android(安卓)播放mp3 tag乱码分析之jni 篇
16lz
2021-01-25
Android media 扫描mp3文件这个重任是cpp来完成的。但是tag解析工作是上层java完成的。
乱码问题的根源是:
java内部是使用16bit的unicode编码(UTF-16)来表示字符串的,无论中文英文都是2字节 ; jni内部是使用UTF-8编码来表示字符串的,UTF-8是变长编码的unicode,一般ascii字符是1字节,中文是3字节 ; c/c++使用的是原始数据,ascii就是一个字节了,中文一般是GB2312编码,用两个字节来表示一个汉字 。
解决办法是:
jni返回给java的字符串,c/c++首先应该负责把这个字符串变成UTF-8或者UTF-16格式,然后通过NewStringUTF或者NewString来把它封装成jstring,返回给java就可以了。
若ASCII码直接转换:
result=(env)->NewStringUTF(str );
若含有中文字符:
int length =mbstowcs(wchar_t *wcstr,const char *mbstr,size_t count);
这个函数的第三个参数count,大小一定要是mbstr长度的2倍,否则出来的中文也会是乱码 。
buffer = (unsigned short *)malloc( length*2 + 1 );
result=(env)->NewString( (jchar*)buffer, length );
更多相关文章
- 没有一行代码,「2020 新冠肺炎记忆」这个项目却登上了 GitHub 中
- 分支和循环(二)(零基础学习C语言)
- Android客户端与服务端交互之登陆示例
- 阿里巴巴的FastJson数据解析介绍
- 微信 JSSDK 在 Android(安卓)和 iOS 的一处不一致
- Android(安卓)API 中文 (15) ―― GridView
- android 联系人快速搜索
- 巨佬Jake Wharton谈Android对Java 8的支持
- Java中怎样判断一个字符串是否是数字