JAVA与C++::关于JNI中文字符串操作问题总结
Linux宝库 收集整理 作者:zosatapo 时间:2007-09-30 收藏本站
来自:http://www.linuxpk.com/6066.html
联系:linuxmine#gmail.com
分类:[编程技术]
[问题简单背景]
使用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%\bin\javac jni.java
得到接口文件
%JAVA_HOME%\bin\javah 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("\n[在NATIVE环境中]'测'的UNICODE=%d",*p);
newstring=(jchar*)p;
ret=env->NewString(newstring,1);
//-- 测试第二部分 --
const jchar * jstr;
jboolean copy='1';
jstr=env->GetStringChars(s,©);
wprintf(L"\n[从JAVA环境传入字符]%s\n",jstr);
env->ReleaseStringChars(s,jstr);
return ret;
}
============================
运行测试程序
============================
把编译后的DLL文件放在恰当的位置(不会不知道什么是恰当的位置吧)。
如果你真的不知道的话,告诉你一个最简单的方式,看看
java.library.path属性就知道了。
程序运行结果。
%JAVA_HOME%\bin\java 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)自己仔细看看上面的代码就可以了.本文来自:http://www.linuxpk.com/6066.html
分享到:
相关推荐
在JNI中处理中文字符串可能会遇到一些挑战,因为Java的Unicode编码与C/C++的标准字符集(如ASCII或ISO-8859-1)不完全兼容。本资料将详细介绍如何在JNI中正确地传递和处理中文字符串。 首先,我们需要理解Java和C/...
在本示例中,我们关注的是JNI中的字符串参数传递和返回值处理,这对于那些需要在Java和C/C++之间进行深度集成的项目非常重要。 1. **JNI基本概念** JNI是Java平台提供的一个接口,它使得开发者可以编写本地方法...
#### JAVA与C++::关于JNI中文字符串操作问题总结 1. **问题汇总**:总结在处理中文字符串时常见的问题。 2. **解决方案**:提供具体的解决方案和建议。 3. **代码示例**:给出处理中文字符串的相关代码示例。 ####...
- 字符串和数组处理:JNI提供了处理Java字符串和数组的方法,包括转换为本地格式和反之。 - 类和字段操作:可以通过JNI访问和修改Java类的静态字段,以及实例字段。 5. **文件列表相关知识点**: - `JNI编程.doc...
- 在JNI层,通过`JNIEnv`接口提供的`NewStringUTF()`函数,接收字节数组并创建一个UTF-8编码的JNI字符串。 2. **JNI到Java的字符串转换**: - 在JNI层,可以使用`GetStringUTFChars()`函数获取Java字符串的UTF-8...
总的来说,JNI中的字符串操作需要对Java和C/C++的内存管理、异常处理以及Unicode编码有深入理解。通过`NewString`,开发者可以在C/C++代码中创建Java字符串对象,进而实现更灵活的跨语言交互。在实际开发中,应确保...
- Java 的 `String` 对应于 C/C++ 的 `jstring` 类型,表示Java字符串的引用。 #### 二、C/C++ 中 jclass 获取 JNI 提供了一些基本的函数来获取 Java 类 (`jclass`) 的引用。这些函数主要定义在 `jni.h` 头文件中...
总结起来,JNI_JAVA_C++的学习涵盖了Java与C++之间的通信机制,涉及数据传递、方法调用、字段访问等多个方面。通过实践这些示例项目,开发者可以掌握如何在两个语言间高效地协同工作,充分利用各自的优势。在移动...
总结起来,Android中的JNI与`jstring`使用涉及到Java与C/C++之间的交互,包括如何获取和释放字符串的UTF-8表示,以及如何在两个环境中安全地传递数据。熟悉这些概念和操作对优化性能、利用原生库和实现特定功能至关...
在IT领域,跨语言通信是常见的需求之一,而C++与Java之间的交互就涉及到了Java Native Interface (JNI)。本文将深入探讨如何使用C++创建Java虚拟机(JVM),并通过JNI来调用Java函数。这是一项技术性很强的任务,...
描述提到"实现了C语言与java端之间互相传递汉字的功能",这意味着这个示例项目包含了一个完整的解决方案,演示了如何在两端进行正确编码和解码,以确保中文字符在转换过程中不被破坏。通常,这会涉及到Java的`String...
本篇文章将深入探讨如何在NDK环境中调用Java的构造方法、父类方法以及处理Java返回的中文字符串可能出现的乱码问题。 首先,让我们了解一下在C/C++中调用Java的方法。这主要依赖于JNI(Java Native Interface)。...
3. **字符串数组传递**:与单个字符串类似,字符串数组也需要转换为C的字符指针数组。`NewObjectArray`用于创建一个新的对象数组,`GetObjectArrayElement`获取数组中的元素,然后将每个元素转换为C字符串。处理完毕...
这里,`JNIEnv`指针用于访问JNI函数,`CallVoidMethod`调用Java的`println`方法输出字符串。 **步骤4:构建本地库** 在Visual Studio 2019中配置项目,设置生成动态链接库(DLL)或静态库(LIB)。确保链接器输入中...
总结来说,使用JNI调用本地接口处理中文字符串,需要关注以下几个要点: 1. 理解Java和C/C++字符串编码的差异:Java字符串是Unicode(UTF-16)编码,C/C++中可以使用`wchar_t`处理宽字符。 2. 使用JNI提供的API进行...
最后,`使用JNI调用本地接口.doc`可能是详细的步骤文档,而`JavaUseDll`可能是一个Java示例程序,演示如何在Java代码中调用本地接口并传递中文字符串。运行这个程序,你可以看到JNI成功地处理了中文字符的传递。 ...
注意,由于Java对象不能直接在JNI中跨线程使用,因此如果要在C/C++中存储或操作Java对象,通常需要将对象序列化为基本类型(如整数或字符串)。对于复杂的对象,可能需要自定义序列化和反序列化逻辑。 5. **内存...
- **字符串处理**:JNI提供了处理Java字符串到C字符串和反向转换的函数。 4. **示例与调试** - **Hello World示例**:一个简单的例子是创建一个Java类,声明一个`native`方法,然后在C/C++中实现该方法,打印...
- **处理Java对象**:C++代码可以创建、访问和修改Java对象,包括字符串、数组、类实例等。 4. **编译和链接**: - **生成动态链接库**:使用C++编译器(如g++)编译源码,并链接到JNI库,生成适用于目标操作系统...