【JNI】Java与C++中文字串的传递
来源:互联网 发布:java银行转账接口 编辑:程序博客网 时间:2024/06/05 09:21
首先,需要明确几个关于字符编码的基本概念:
◆
◆ jni内部是使用utf-8编码来表示字符串的,utf-8是变长编码的unicode,一般ascii字符是1字节,中文是3字节;
◆ c/c++使用的是原始数据,ascii就是一个字节,中文一般是GB2312编码,用2个字节表示一个汉字。
jni的中文字符串处理
先从字符流的方向分别对java-->C++和C++-->java进行分析
◆ java-->C++
这种情况下,java调用的时候使用的是utf-16编码的字符串,jvm把这个参数传递给jni,C++得到的输入是jstring,此时,可以利用jni提供的两种函数,一个是GetStringUTFChars,这个函数将得到一个UTF-8编码的字符串;另一个是GetStringChars这个将得到UTF-16编码的字符串。无论那个函数,得到的字符串如果含有中文,都需要进一步转化成GB2312的编码。
◆
jni返回给java的字符串,c/c++首先应该负责把这个字符串变成UTF-8或者UTF-16格式,然后通过NewStringUTF或者NewString来把它封装成jstring,返回给java就可以了。
如果字符串中不含中文字符,只是标准的ascii码,那么用GetStringUTFChars/NewStringUTF就可以搞定了,因为这种情况下,UTF-8编码和ascii编码是一致的,不需要转换。
但是如果字符串中有中文字符,那么在c/c++部分进行编码转换就是一个必须了。我们需要两个转换函数,一个是把UTF8/16的编码转成GB2312;一个是把GB2312转成UTF8/16。
下面是一个测试DEMO,native代码( NDK samples下hellojni ) : (注意红色部分代码及API)
#include <string.h>
#include <locale.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <android/log.h>
#include <jni.h>
#define LOG_TAG "hellojni_native"
#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__))
#define LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__))
//Java字符串的类和获取方法ID
jclass
jmethodID gmidStringInit;
jmethodID gmidStringGetBytes;
int isASCII(const char * chp)
{
}
// jstring to char*
char* JstringToPchar(JNIEnv* env, jstring jstr, const char * encoding)
{
}
//char* to jstring
jstring PcharToJstring(JNIEnv* env, const char* pchar,const char * encoding)
{
}
jstring
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,jobject thiz )
{
}
- 【JNI】Java与C++中文字串的传递
- 【JNI】Java与C++中文字串的传递
- Java与C之间通过JNI传递中文字符串
- Java与C之间通过JNI传递中文字符串
- Android JNI实现Java与C的数据传递
- Java与C之间通过JNI传递中文字符串及乱码问题
- Java与C之间通过JNI传递中文字符乱码解决
- Java与C之间通过JNI传递中文字符乱码解决
- dojo传递中文字串时的问题
- 通过JNI在JAVA与C程序中传递参数
- Android使用JNI实现Java与C之间传递数据
- Android使用JNI实现Java与C之间传递数据
- Android使用JNI实现Java与C之间传递数据
- Android使用JNI实现Java与C之间传递数据
- Android使用JNI实现Java与C之间传递数据
- Android使用JNI实现Java与C之间传递数据
- Android使用JNI实现Java与C之间传递数据
- Android使用JNI实现Java与C之间传递数据
- Android Bitmap 优化(2) - 图片缓存
- 知识点3-4
- SCN与数据恢复的关系
- oracle 关于sum函数
- 关于max_allowed_packet的修改
- 【JNI】Java与C++中文字串的传递
- QT creator交叉编译配置
- 网络七层协议 五层模型 TCP连接 HTTP连接 socket套接字
- C 指针
- Oracle SCN详解
- CFileFind类的详解以及应用实例
- [FAQ04794]如何修改默认数据连接开关
- 【HTML5/CSS/JS】开发跨平台应用工具的选择(三)
- Google和伙伴们把PROMETHEUS加入Kubernetes平台