JNI char*转jstring乱码问题

绝世酱油瓶 绝世酱油瓶 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
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, "<init>", "([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 << status <<endl;
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";
都不会乱码。、这个倒底怎么回事?没人知道吗
...全文

相关推荐

NDK开发之C语言调用Java构造方法、父类方法、返回中文字符串乱码问题案例

NDK开发之C语言调用Java构造方法、父类方法、返回中文字符串乱码问题案例详细解析。

「已注销」

Emoji表情在Android JNI中的兼容性问题详解

起因 最近遇到一个问题,把某个字符串计算MD5,之后把该字符串加密与MD5一起上传到服务端,服务端解密后重新计算md5发现与上传的MD5不一致,而出问题的字符串中无一例外都有Emoji表情。但我自己弄个带表情的字符串上传却没有什么问题。 最终确认这是在Android 5.1以下 jstring -> char数组 时出的问题。下面通过一个示例来还原这个过程。 事件还原 假设有一个字符串s,String s = \uD83D\uDC8B; ,对应表情:kiss_mark:。通过调用getBytes()方法,会看到对应的byte数组为[-16, -97, -110, -117] ,按16进制输出为[f0,

weixin_38700409

Android NDK 学习

Android NDK 学习 JavaString转C++String

MrWP

【工业自动化】欧姆龙PLC产品线与编程软件应用:从选型架构到调试排错的全流程技术指南

内容概要:本文《欧姆龙PLC与编程软件完全手册》系统介绍了欧姆龙PLC的产品架构、软件体系、通信协议、选型策略及编程调试技巧。重点区分了两大技术平台:基于CX-Programmer的传统C系列(CP/CJ/CS)与基于Sysmac Studio的新一代Sysmac平台(NJ/NX/NY),强调二者在软件生态、寻址方式和通信架构上的根本差异。手册详细对比了各系列PLC的性能参数,并提供与西门子产品的功能对标,帮助用户快速定位。深入讲解了编程操作中的关键问题,如任务结构设计、间接寻址、FB封装陷阱、在线调试五件套等,特别指出“FB使能关闭时状态不初始化”等易出错点。最后汇总了选型路径与现场避坑清单,极具实战指导价值。; 适合人群:具备一定工业自动化基础,从事PLC编程、设备调试、系统集成的研发工程师和技术人员,尤其是从西门子平台转向欧姆龙或参与新项目选型的1-5年经验从业者。; 使用场景及目标:① 新项目选型时判断应选用C系列还是Sysmac平台;② 编程调试过程中掌握高效操作技巧与常见问题排查方法;③ 实现跨平台迁移、系统升级或接手他人项目时规避架构与逻辑陷阱;④ 提升对欧姆龙PLC任务机制、间接寻址、FB设计等高级功能的理解与应用能力。; 阅读建议:本手册理论结合实践,建议按“先架构后操作”的顺序阅读,重点章节需结合实际工程反复演练。特别是FB设计规范、任务切换处理、强制操作收尾流程等内容,应在仿真环境中验证后再应用于现场。注意版本匹配问题,操作前确认所用软件与控制器固件版本兼容。

莫问西东LJ

CISP-CSE注册云安全工程师备考资源包

CISP-CSE注册云安全工程师备考资源包

嫑甭歪孬
评论 7
收藏 已收藏
分享
返回顶部
绝世酱油瓶
Java SE 62,621 成员 307,251 内容