目录

基本概念

演示过程


基本概念

这里我把他总结成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语言解决中文乱码问题相关推荐

  1. Java笔记-Spring Boot使用外部Tomcat及解决Tomcat乱码

    首先是解决Tomcat打印乱码问题: 修改conf/logging.properties java.util.logging.ConsoleHandler.encoding = GBK 如下: 即可 ...

  2. Base64 JAVA后台编码与JS前台解码(解决中文乱码问题)

    中文通过Java后台进行Base64编码后传到前台,通过JS进行Base64解码时会出现中文乱码的问题,被这个问题也是困扰了几天,使用jquery.base64.js只能转码非中文字符,经过搜集各种方 ...

  3. java odbc excel_利用odbc连接excel,解决中文乱码问题。

    1.Excel 名称:test.xls 内容如下: 专业名称 申请学位 姓名 毕业学校 毕业专业 图形学 硕士 曾宏波 中国科学技术大学 数学 线性代数 硕士 樊昊霏 北京大学 基础数学 离散数学 硕 ...

  4. Java笔记-JNI中简单的参数与返回值处理

    目录 基本概念 代码及演示 基本概念 此篇博文记录了JNI的基本规范,与使用: https://blog.csdn.net/qq78442761/article/details/94849374 在本 ...

  5. JAVA:如何读写txt文件,并解决中文乱码问题

    读写文件的编码格式需要保持一致,否则可能会出现中文乱码问题.以下使用UTF-8编码方式写入和读取文件. 1.写入txt文件 //--------------写入文本-------------//Str ...

  6. 数据挖掘之Matplotlib中如何不下载包解决中文乱码问题

    使用plt.rcParams()方法设置字体 plt.rcParams['font.sans-serif']    指定默认字体         plt.rcParams.update({" ...

  7. JAVA Web项目中所出现错误及解决方式合集(不断更新中)

    JAVA Web项目中所出现错误及解决方式合集 前言 一.几个或许会用到的软件下载官网 二.Eclipse的[preferences]下没有[sever]选项 三.Tomcat的安装路径找不到 四.T ...

  8. java web 中有效解决中文乱码问题-pageEncoding与charset区别, response和request的setCharacterEncoding 区别

    java web 中有效解决中文乱码问题-pageEncoding与charset区别, response和request的setCharacterEncoding 区别 参考文章: (1)java ...

  9. 解决java web中safari浏览器下载后文件中文乱码问题

    解决java web中safari浏览器下载后文件中文乱码问题 参考文章: (1)解决java web中safari浏览器下载后文件中文乱码问题 (2)https://www.cnblogs.com/ ...

最新文章

  1. 小功告成:ReadIE beta
  2. Spring 4 + Reactor Integration Example--转
  3. git 修改分支名字_开发中必须要掌握的 Git 技巧
  4. 要学好 C 语言 / C++ ,Makefile 可少不了
  5. 通过界面生成时不存在的数据刷新界面引起的卡顿问题
  6. RTX5 | 线程管理01 - 创建线程(静态堆栈方式)
  7. php mysql子查询,mysql子查询命令
  8. iOS AVPlayer视频播放器
  9. 设计一款知识性产品需要考虑十二个基本问题
  10. python dict嵌套dict_处理复杂嵌套dict结构的python方法
  11. 插入排序算法(insertion-sort)
  12. fileupload控件的属性_WebForm之FileUpload控件(文件上传)
  13. 智能交通中的若干科学和技术问题
  14. 计算机历史记录无法删除,win10时间线灰色浏览记录删不掉怎么回事_win10时间线历史灰色无法删除的解决教程-win7之家...
  15. CSS中如何实现表格文字的换行
  16. php毕业论文总结,毕业设计总结
  17. html required 无效,html5的input的required使用中遇到的问题及解决方法
  18. 计算机强制关机后无法正常启动,win10系统强制关机后无法正常启动了如何解决...
  19. html文字抖动效果,CSS实现TikTok文字抖动效果示例
  20. 关于测试思维的个人思考框架

热门文章

  1. 【推荐】(SqlServer)不公开存储过程sp_Msforeachtable与sp_Msforeachdb详解
  2. 做一个中国式站长必须知道的五十个问题
  3. 第一个Ajax.net程序的实现及心得。
  4. 程序员求职面试丨面试必备之终极指导篇,掌握这些,面试不再困难!
  5. 数据库查询经常卡死?面对亿级大数据量,我是这么展示分析的
  6. 飞鸽传书2011什么时候更新?
  7. 标准炮灰三人组飞鸽传书武侠片
  8. 飞鸽传书,又见飞鸽传书,
  9. 我对C++内存分配方式的一点看法
  10. Python3基本数据类型快速入门