android jni char* jstring 乱码,JNI char*转jstring乱码有关问题

博主在JNI中遇到将JNIchar*转换为jstring时出现乱码问题,尝试了多种方法如UTF-8编码和CharByReference。解决建议包括使用JNA避免编码问题。测试案例显示,字符编码一致性至关重要。
摘要由CSDN通过智能技术生成

JNI char*转jstring乱码问题

本帖最后由 Java_Devil 于 2013-01-19 16:16:42 编辑

JNIEXPORT jstring JNICALL Java_com_szzc_jni_JniApi_getCardSerial

(JNIEnv * env, jobject obj, jcharArray js){

hModule=LoadLibrary("OUR_MIFARE.dll");

gcnum = (getCardNum)GetProcAddress(hModule, "piccrequest");

//.....

unsigned char * str = (unsigned char *)env->GetCharArrayElements(js,NULL);

unsigned char cardNum = gcnum(str);

printf("卡列号:\n");

unsigned char* p = str;

while(*p!='\0'){

printf("%x\n",*p);

p++;

}

//定义java String类 strClass

jclass strClass = env->FindClass("Ljava/lang/String;");

//获取java String类方法String(byte[],String)的构造器,用于将本地byte[]数组转换为一个新String

jmethodID ctorID = env->GetMethodID(strClass, "", "([BLjava/lang/String;)V");

//建立byte数组

jbyteArray bytes = env->NewByteArray((jsize)strlen((const char *)str));

//将char* 转换为byte数组

env->SetByteArrayRegion(bytes, 0, (jsize)strlen((const char *)str), (jbyte*)(const char *)str);

//设置String, 保存语言类型,用于byte数组转换至String时的参数

jstring encoding = env->NewStringUTF("utf-8");

//将byte数组转换为java String,并输出

jstring status = (jstring)env->NewObject(strClass, ctorID, bytes, encoding);

cout <

return status;

//return (jstring)cardNum;

}

我需要将str的值返回给java端、while循环打印出来的结果是:1a a7 de d4这个是正确的结果、

我经过转jstring的操作之后、就过就不对了、而且一直变化、java端收到也是乱码、这个该怎么处理?或者以什么形式返回、急啊、希望大牛们能自己编写一个测试的dll测试过了给个解决办法?

---------------------------------------------下面是我补充刚做的测试:

unsigned char  devicenumber[4];

devicenumber[0]=7;

devicenumber[1]=111;

devicenumber[2]=218;

devicenumber[3]=64;

jstring deviceNum = env->NewStringUTF((const char*)devicenumber);

return deviceNum;

C端直接写死、s = new JniApi().getDeviceNo(test);

System.out.println(s);

String str = new String(s.getBytes("UTF-8"));

System.out.println(str);

java打印的都是乱码、

C端如果这样写、写成字符串、unsigned cahr * test="1A2B3C4D";都不会乱码。、这个倒底怎么回事?没人知道吗

------解决方案--------------------

推荐楼主用JNA技术来用java调用C或C++写的DLL,我前段时间也遇到了用java调用C++写的dll的问题,我是直接没写成,总是报错,N种错。最后用JNA解决了,貌似到现在一直没出问题,几个月了。

------解决方案--------------------

jna中要使用char *必须用CharByReference类型

------解决方案--------------------

unsigned char  devicenumber[4];

devicenumber[0]=7;

devicenumber[1]=111;

devicenumber[2]=218;

devicenumber[3]=64;

jstring deviceNum = env->NewStringUTF((const char*)devicenumber);

return deviceNum;

如果这样导致乱码,是编解码不一致导致,先搞清楚c这边是怎么编码的

查看下deviceNum的值来推测

不妨参考下这个例子

// Prompt user for a C-string

char outCStr[128];

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值