JAVA与C++::关于JNI中文字符串操作问题总结
2008-04-25 16:39
1026 查看
JAVA与C++::关于JNI中文字符串操作问题总结
/**
*
*@Author ZosaTapo
*
*@E-Mail dertyang@263.net
*
*@QQ 1670967
*
*/
[问题简单背景]
使用JAVA编程有时候需要使用JNI来实现效率方面或者是其他方面的问题。在JNI使用中不得不面临
的问题就是中文问题(如果你是老外,并且不关心中国建设,那就不用看了;或者你已经知道如何解决
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
的话,你也不用看了),JAVA采用UNICODE来支持运行时,当然类文件的保存格式是UTF-8。
~~~~~~~~~~~~~~~~~
当然了你用pure JAVA也不会出现问题的,其他出现的问题也不包含在今天的论题中(比如文件保存的字符集
或者是WEB开发中的中文问题)。当我们需要使用JAVA和本地环境混合编程时候,问题就来了:
(1)JAVA如何传递UNICODE字符串到本地环境
(2)本地环境如何传递UNICODE字符到JAVA环境
当然了,中国人我只关心中文在之间的转化,英文很好办,因为没有问题的,其他语言偶不关心。
[测试环境说明]
下面说明一下本人使用的环境。
(1)WINDOWS2000 Professional/512M DDR RAM/P4 2.0G
(2)SUN JDK1.4.0
(3)VC++ 6.0 /SP5
[测试过程说明]
============================
编写JAVA程序,得到接口文件
============================
//JNI.JAVA
public class JNI
{
static
{
System.loadLibrary("JNI");
}
public native String getChinese(String str);
public static void main(String args[])
{
JNI j=new JNI();
System.err.println("[从NATIVE环境返回字符]"+j.getChinese("测"));
char ch='测';
System.err.println("[在JAVA环境中]'测'的UNICODE="+(int)ch);
}
}
编译JAVA程序
%JAVA_HOME%inJAVAc JNI.JAVA
得到接口文件
%JAVA_HOME%inJAVAh JNI
//JNI.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <JNI.h>
/* Header for class JNI */
#ifndef _Included_JNI
#define _Included_JNI
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: JNI
* Method: getChinese
* Signature: (LJAVA/lang/String;)LJAVA/lang/String;
*/
JNIEXPORT jstring JNICALL JAVA_JNI_getChinese
(JNIEnv *, jobject, jstring);
#ifdef __cplusplus
}
#endif
#endif
============================
编写本地实现
============================
具体怎么写DLL等,我看我就不用讲了,所以我只是简单
摘写相关的代码。
//#include "JNI.h"
JNIEXPORT jstring JNICALL JAVA_JNI_getChinese
(JNIEnv *env, jobject obj, jstring s)
{
jchar * newstring;
jstring ret=0;
/*
//-- 测试第三部分 --
newstring=new jchar[1];
newstring[0]=27979;//中文'测'的unicode
ret=env->NewString(newstring,1);
delete []newstring;
*/
//-- 测试第一部分 --
wchar_t* p=L"测";
printf("[在NATIVE环境中]'测'的UNICODE=%d",*p);
newstring=(jchar*)p;
ret=env->NewString(newstring,1);
//-- 测试第二部分 --
const jchar * jstr;
jboolean copy='1';
jstr=env->GetStringChars(s,©);
wprintf(L"[从JAVA环境传入字符]%s",jstr);
env->ReleaseStringChars(s,jstr);
return ret;
}
============================
运行测试程序
============================
把编译后的DLL文件放在恰当的位置(不会不知道什么是恰当的位置吧)。
如果你真的不知道的话,告诉你一个最简单的方式,看看
JAVA.library.path属性就知道了。
程序运行结果。
%JAVA_HOME%inJAVA JNI
[在NATIVE环境中]'测'的UNICODE=27979
[[从NATIVE环境返回字符]测
[在JAVA环境中]'测'的UNICODE=27979
============================
解释测试过程
============================
由于JAVA是UNICODE运行时的,我很懒,自己不可能写字节码与UNICODE之间的转码程序。
网上有的,实际上很多TELNET客户端程序都是自己带有的。但是我们就运行在WINDOWS环境下
当然就直接使用他的UNICODE支持了(UNIX环境当然也有相应的支持)。
(1)确认我们使用UNICODE支持。请仔细阅读TCHAR.h文件,不管你是为了本次测试还是为了提高你WINDOWS编程的认识
。
类型使用wchar_t作为本地字符UNICODE支持。
(2)自己熟悉一下JNI接口关于UTF和UNICODE操作的相关函数。
(3)自己仔细看看上面的代码就可以了.
/**
*
*@Author ZosaTapo
*
*@E-Mail dertyang@263.net
*
*@QQ 1670967
*
*/
[问题简单背景]
使用JAVA编程有时候需要使用JNI来实现效率方面或者是其他方面的问题。在JNI使用中不得不面临
的问题就是中文问题(如果你是老外,并且不关心中国建设,那就不用看了;或者你已经知道如何解决
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
的话,你也不用看了),JAVA采用UNICODE来支持运行时,当然类文件的保存格式是UTF-8。
~~~~~~~~~~~~~~~~~
当然了你用pure JAVA也不会出现问题的,其他出现的问题也不包含在今天的论题中(比如文件保存的字符集
或者是WEB开发中的中文问题)。当我们需要使用JAVA和本地环境混合编程时候,问题就来了:
(1)JAVA如何传递UNICODE字符串到本地环境
(2)本地环境如何传递UNICODE字符到JAVA环境
当然了,中国人我只关心中文在之间的转化,英文很好办,因为没有问题的,其他语言偶不关心。
[测试环境说明]
下面说明一下本人使用的环境。
(1)WINDOWS2000 Professional/512M DDR RAM/P4 2.0G
(2)SUN JDK1.4.0
(3)VC++ 6.0 /SP5
[测试过程说明]
============================
编写JAVA程序,得到接口文件
============================
//JNI.JAVA
public class JNI
{
static
{
System.loadLibrary("JNI");
}
public native String getChinese(String str);
public static void main(String args[])
{
JNI j=new JNI();
System.err.println("[从NATIVE环境返回字符]"+j.getChinese("测"));
char ch='测';
System.err.println("[在JAVA环境中]'测'的UNICODE="+(int)ch);
}
}
编译JAVA程序
%JAVA_HOME%inJAVAc JNI.JAVA
得到接口文件
%JAVA_HOME%inJAVAh JNI
//JNI.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <JNI.h>
/* Header for class JNI */
#ifndef _Included_JNI
#define _Included_JNI
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: JNI
* Method: getChinese
* Signature: (LJAVA/lang/String;)LJAVA/lang/String;
*/
JNIEXPORT jstring JNICALL JAVA_JNI_getChinese
(JNIEnv *, jobject, jstring);
#ifdef __cplusplus
}
#endif
#endif
============================
编写本地实现
============================
具体怎么写DLL等,我看我就不用讲了,所以我只是简单
摘写相关的代码。
//#include "JNI.h"
JNIEXPORT jstring JNICALL JAVA_JNI_getChinese
(JNIEnv *env, jobject obj, jstring s)
{
jchar * newstring;
jstring ret=0;
/*
//-- 测试第三部分 --
newstring=new jchar[1];
newstring[0]=27979;//中文'测'的unicode
ret=env->NewString(newstring,1);
delete []newstring;
*/
//-- 测试第一部分 --
wchar_t* p=L"测";
printf("[在NATIVE环境中]'测'的UNICODE=%d",*p);
newstring=(jchar*)p;
ret=env->NewString(newstring,1);
//-- 测试第二部分 --
const jchar * jstr;
jboolean copy='1';
jstr=env->GetStringChars(s,©);
wprintf(L"[从JAVA环境传入字符]%s",jstr);
env->ReleaseStringChars(s,jstr);
return ret;
}
============================
运行测试程序
============================
把编译后的DLL文件放在恰当的位置(不会不知道什么是恰当的位置吧)。
如果你真的不知道的话,告诉你一个最简单的方式,看看
JAVA.library.path属性就知道了。
程序运行结果。
%JAVA_HOME%inJAVA JNI
[在NATIVE环境中]'测'的UNICODE=27979
[[从NATIVE环境返回字符]测
[在JAVA环境中]'测'的UNICODE=27979
============================
解释测试过程
============================
由于JAVA是UNICODE运行时的,我很懒,自己不可能写字节码与UNICODE之间的转码程序。
网上有的,实际上很多TELNET客户端程序都是自己带有的。但是我们就运行在WINDOWS环境下
当然就直接使用他的UNICODE支持了(UNIX环境当然也有相应的支持)。
(1)确认我们使用UNICODE支持。请仔细阅读TCHAR.h文件,不管你是为了本次测试还是为了提高你WINDOWS编程的认识
。
类型使用wchar_t作为本地字符UNICODE支持。
(2)自己熟悉一下JNI接口关于UTF和UNICODE操作的相关函数。
(3)自己仔细看看上面的代码就可以了.
相关文章推荐
- JAVA与C++::关于JNI中文字符串操作问题总结
- 关于c++与java中文乱码问题分析与解决
- 关于Java web开发中文乱码问题的总结
- 关于Java字符串操作的思考和总结
- jni关于从java端调用C++的问题
- Java与C之间通过JNI传递中文字符串及乱码问题
- 1 通过JNI混合使用Java和C++ -----> 操作字符串
- 关于C++调用jar包,在创建虚拟机时使用JNI_CreateJavaVM调用失败返回-1的问题
- 关于中文乱码问题总结----java
- JNI之c/c++返回中文给java 乱码问题以及java数组在c排序
- Java JNI 调用C++ API及中文编码问题
- 总结java关于jacob操作word这几天遇到的问题!
- Java JNI 调用C++ API及中文编码问题
- 文《关于c++与java中文乱码问题分析与解决》中一个bug分析
- Java与C\C++之间通过JNI传递中文字符串
- Java 关于中文乱码处理的经验总结
- 总结一些关于操作数据库是sql语句还是存储过程问题
- JAVA编码(中文转码)问题总结
- android jni c/c++线程通过CallVoidMethod调用java函数出现奔溃问题
- 关于c/c++和java中数组整体赋值的问题