Java笔记-JNI中Java与C语言解决中文乱码问题
目录
基本概念
演示过程
基本概念
这里我把他总结成4个步骤:
1. 找类,Java的String;
2. 找函数String类的方法,成员函数;
3. 设置要转换的字符和编码;
4. 程序生成编码后的字符串;
演示过程
程序运行截图如下:
程序结构如下:
源码分别如下:
Prompt.c
#include <jni.h>
#include <stdio.h>
#include "Prompt.h"jstring stoJstring(JNIEnv* env, const char* pat){//第一个参数为this,第二个参数为类的名字;//如果FindClass找类失败,将返回NULL,并抛出NoClassDefFoundError异常;//返回NULL可能是没有找到类,也有可能是内存不足。jclass strClass = (*env)->FindClass(env, "java/lang/String");//第一个参数为this,第二个参数为类名,第三个参数为方法名,第四个参数为标签主要用于确保有多个重载函数时,能够调用>
正确的jmethodID ctorID = (*env)->GetMethodID(env, strClass, "<init>", "([BLjava/lang/String;)V");//需要搞的字符串jbyteArray bytes = (*env)->NewByteArray(env ,strlen(pat));(*env)->SetByteArrayRegion(env, bytes, 0, strlen(pat), (jbyte*)pat);//设置java能看懂的gbk这个字符串jstring encoding = (*env)->NewStringUTF(env, "gbk");//相当于java中的 new String(byteArray, encoding);return (jstring)(*env)->NewObject(env, strClass, ctorID, bytes, encoding);
} char* jstringTostring(JNIEnv* env, jstring jstr){char* rtn = NULL;jclass clsstring = (*env)->FindClass(env, "java/lang/String");jstring strencode = (*env)->NewStringUTF(env, "gbk");jmethodID mid = (*env)->GetMethodID(env, clsstring, "getBytes", "(Ljava/lang/String;)[B");jbyteArray barr= (jbyteArray)(*env)->CallObjectMethod(env, jstr, mid, strencode);jsize alen = (*env)->GetArrayLength(env, barr);jbyte* ba = (*env)->GetByteArrayElements(env, barr,JNI_FALSE);if(alen > 0){rtn = (char*)malloc(alen + 1);memcpy(rtn, ba, alen);rtn[alen] = 0;}(*env)->ReleaseByteArrayElements(env, barr, ba, 0);return rtn;
}JNIEXPORT jstring JNICALL Java_Prompt_getLine(JNIEnv *env, jobject obj, jstring prompt){jboolean isCopy;const char *charPt = jstringTostring(env, prompt);char strChar[100];strncpy(strChar, charPt, strlen(charPt));printf("JAVA 给的数据:%s\n", strChar);char *ret = "结果Hello";printf("C语言返回输出: %s\n", ret);//jstring retStr = (*env)->NewStringUTF(env, ret);return stoJstring(env, ret);
}
Prompt.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Prompt */#ifndef _Included_Prompt
#define _Included_Prompt
#ifdef __cplusplus
extern "C" {
#endif
/** Class: Prompt* Method: getLine* Signature: (Ljava/lang/String;)Ljava/lang/String;*/
JNIEXPORT jstring JNICALL Java_Prompt_getLine(JNIEnv *, jobject, jstring);#ifdef __cplusplus
}
#endif
#endif
Prompt.java
import java.util.*;class Prompt{private native String getLine(String prompt);public static void main(String args[]) throws Exception{Prompt p = new Prompt();String input = p.getLine("中文1123Hello");System.out.println("User typed: " + input);}static {System.loadLibrary("Prompt");}
}
不知道怎么编译的同志请看这篇博文:
https://blog.csdn.net/qq78442761/article/details/95477368
Java笔记-JNI中Java与C语言解决中文乱码问题相关推荐
- Java笔记-Spring Boot使用外部Tomcat及解决Tomcat乱码
首先是解决Tomcat打印乱码问题: 修改conf/logging.properties java.util.logging.ConsoleHandler.encoding = GBK 如下: 即可 ...
- Base64 JAVA后台编码与JS前台解码(解决中文乱码问题)
中文通过Java后台进行Base64编码后传到前台,通过JS进行Base64解码时会出现中文乱码的问题,被这个问题也是困扰了几天,使用jquery.base64.js只能转码非中文字符,经过搜集各种方 ...
- java odbc excel_利用odbc连接excel,解决中文乱码问题。
1.Excel 名称:test.xls 内容如下: 专业名称 申请学位 姓名 毕业学校 毕业专业 图形学 硕士 曾宏波 中国科学技术大学 数学 线性代数 硕士 樊昊霏 北京大学 基础数学 离散数学 硕 ...
- Java笔记-JNI中简单的参数与返回值处理
目录 基本概念 代码及演示 基本概念 此篇博文记录了JNI的基本规范,与使用: https://blog.csdn.net/qq78442761/article/details/94849374 在本 ...
- JAVA:如何读写txt文件,并解决中文乱码问题
读写文件的编码格式需要保持一致,否则可能会出现中文乱码问题.以下使用UTF-8编码方式写入和读取文件. 1.写入txt文件 //--------------写入文本-------------//Str ...
- 数据挖掘之Matplotlib中如何不下载包解决中文乱码问题
使用plt.rcParams()方法设置字体 plt.rcParams['font.sans-serif'] 指定默认字体 plt.rcParams.update({" ...
- JAVA Web项目中所出现错误及解决方式合集(不断更新中)
JAVA Web项目中所出现错误及解决方式合集 前言 一.几个或许会用到的软件下载官网 二.Eclipse的[preferences]下没有[sever]选项 三.Tomcat的安装路径找不到 四.T ...
- java web 中有效解决中文乱码问题-pageEncoding与charset区别, response和request的setCharacterEncoding 区别
java web 中有效解决中文乱码问题-pageEncoding与charset区别, response和request的setCharacterEncoding 区别 参考文章: (1)java ...
- 解决java web中safari浏览器下载后文件中文乱码问题
解决java web中safari浏览器下载后文件中文乱码问题 参考文章: (1)解决java web中safari浏览器下载后文件中文乱码问题 (2)https://www.cnblogs.com/ ...
最新文章
- 小功告成:ReadIE beta
- Spring 4 + Reactor Integration Example--转
- git 修改分支名字_开发中必须要掌握的 Git 技巧
- 要学好 C 语言 / C++ ,Makefile 可少不了
- 通过界面生成时不存在的数据刷新界面引起的卡顿问题
- RTX5 | 线程管理01 - 创建线程(静态堆栈方式)
- php mysql子查询,mysql子查询命令
- iOS AVPlayer视频播放器
- 设计一款知识性产品需要考虑十二个基本问题
- python dict嵌套dict_处理复杂嵌套dict结构的python方法
- 插入排序算法(insertion-sort)
- fileupload控件的属性_WebForm之FileUpload控件(文件上传)
- 智能交通中的若干科学和技术问题
- 计算机历史记录无法删除,win10时间线灰色浏览记录删不掉怎么回事_win10时间线历史灰色无法删除的解决教程-win7之家...
- CSS中如何实现表格文字的换行
- php毕业论文总结,毕业设计总结
- html required 无效,html5的input的required使用中遇到的问题及解决方法
- 计算机强制关机后无法正常启动,win10系统强制关机后无法正常启动了如何解决...
- html文字抖动效果,CSS实现TikTok文字抖动效果示例
- 关于测试思维的个人思考框架