`
klinsmaya
  • 浏览: 7241 次
  • 来自: ...
最近访客 更多访客>>
社区版块
存档分类
最新评论

JAVA与C++::关于JNI中文字符串操作问题总结

阅读更多
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,&copy);

  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传递中文字符串资料

    在JNI中处理中文字符串可能会遇到一些挑战,因为Java的Unicode编码与C/C++的标准字符集(如ASCII或ISO-8859-1)不完全兼容。本资料将详细介绍如何在JNI中正确地传递和处理中文字符串。 首先,我们需要理解Java和C/...

    JNI学习二:字符串参数传递与返回值

    在本示例中,我们关注的是JNI中的字符串参数传递和返回值处理,这对于那些需要在Java和C/C++之间进行深度集成的项目非常重要。 1. **JNI基本概念** JNI是Java平台提供的一个接口,它使得开发者可以编写本地方法...

    JavaJNI资料全整理含自己的常见问题总结.pdf

    #### JAVA与C++::关于JNI中文字符串操作问题总结 1. **问题汇总**:总结在处理中文字符串时常见的问题。 2. **解决方案**:提供具体的解决方案和建议。 3. **代码示例**:给出处理中文字符串的相关代码示例。 ####...

    教你java和C++的jni编程

    - 字符串和数组处理:JNI提供了处理Java字符串和数组的方法,包括转换为本地格式和反之。 - 类和字段操作:可以通过JNI访问和修改Java类的静态字段,以及实例字段。 5. **文件列表相关知识点**: - `JNI编程.doc...

    Android Java代码与JNI交互字符串转换(四)

    - 在JNI层,通过`JNIEnv`接口提供的`NewStringUTF()`函数,接收字节数组并创建一个UTF-8编码的JNI字符串。 2. **JNI到Java的字符串转换**: - 在JNI层,可以使用`GetStringUTFChars()`函数获取Java字符串的UTF-8...

    jni 构造字符串

    总的来说,JNI中的字符串操作需要对Java和C/C++的内存管理、异常处理以及Unicode编码有深入理解。通过`NewString`,开发者可以在C/C++代码中创建Java字符串对象,进而实现更灵活的跨语言交互。在实际开发中,应确保...

    java与c++交互(JNI学习笔记)

    - Java 的 `String` 对应于 C/C++ 的 `jstring` 类型,表示Java字符串的引用。 #### 二、C/C++ 中 jclass 获取 JNI 提供了一些基本的函数来获取 Java 类 (`jclass`) 的引用。这些函数主要定义在 `jni.h` 头文件中...

    JNI_JAVA_C++.zip

    总结起来,JNI_JAVA_C++的学习涵盖了Java与C++之间的通信机制,涉及数据传递、方法调用、字段访问等多个方面。通过实践这些示例项目,开发者可以掌握如何在两个语言间高效地协同工作,充分利用各自的优势。在移动...

    android jni使用字符串

    总结起来,Android中的JNI与`jstring`使用涉及到Java与C/C++之间的交互,包括如何获取和释放字符串的UTF-8表示,以及如何在两个环境中安全地传递数据。熟悉这些概念和操作对优化性能、利用原生库和实现特定功能至关...

    使用C++创建java虚拟机JVM,使用JNI调用java函数.zip

    在IT领域,跨语言通信是常见的需求之一,而C++与Java之间的交互就涉及到了Java Native Interface (JNI)。本文将深入探讨如何使用C++创建Java虚拟机(JVM),并通过JNI来调用Java函数。这是一项技术性很强的任务,...

    android jni 中文字符传递demo

    描述提到"实现了C语言与java端之间互相传递汉字的功能",这意味着这个示例项目包含了一个完整的解决方案,演示了如何在两端进行正确编码和解码,以确保中文字符在转换过程中不被破坏。通常,这会涉及到Java的`String...

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

    本篇文章将深入探讨如何在NDK环境中调用Java的构造方法、父类方法以及处理Java返回的中文字符串可能出现的乱码问题。 首先,让我们了解一下在C/C++中调用Java的方法。这主要依赖于JNI(Java Native Interface)。...

    java与c交互传递字符串和整型

    3. **字符串数组传递**:与单个字符串类似,字符串数组也需要转换为C的字符指针数组。`NewObjectArray`用于创建一个新的对象数组,`GetObjectArrayElement`获取数组中的元素,然后将每个元素转换为C字符串。处理完毕...

    visual studio 2019下C++通过JNI调用JAVA代码

    这里,`JNIEnv`指针用于访问JNI函数,`CallVoidMethod`调用Java的`println`方法输出字符串。 **步骤4:构建本地库** 在Visual Studio 2019中配置项目,设置生成动态链接库(DLL)或静态库(LIB)。确保链接器输入中...

    使用JNI调用本地接口(解决中文问题)

    总结来说,使用JNI调用本地接口处理中文字符串,需要关注以下几个要点: 1. 理解Java和C/C++字符串编码的差异:Java字符串是Unicode(UTF-16)编码,C/C++中可以使用`wchar_t`处理宽字符。 2. 使用JNI提供的API进行...

    使用JNI调用本地接口(解决中文字符传递,源码+说明)

    最后,`使用JNI调用本地接口.doc`可能是详细的步骤文档,而`JavaUseDll`可能是一个Java示例程序,演示如何在Java代码中调用本地接口并传递中文字符串。运行这个程序,你可以看到JNI成功地处理了中文字符的传递。 ...

    jni操作list集合,来存储对象

    注意,由于Java对象不能直接在JNI中跨线程使用,因此如果要在C/C++中存储或操作Java对象,通常需要将对象序列化为基本类型(如整数或字符串)。对于复杂的对象,可能需要自定义序列化和反序列化逻辑。 5. **内存...

    JNI 教程 java与c/c++互相调用

    - **字符串处理**:JNI提供了处理Java字符串到C字符串和反向转换的函数。 4. **示例与调试** - **Hello World示例**:一个简单的例子是创建一个Java类,声明一个`native`方法,然后在C/C++中实现该方法,打印...

    Demo:使用java语言与c++语言通信

    - **处理Java对象**:C++代码可以创建、访问和修改Java对象,包括字符串、数组、类实例等。 4. **编译和链接**: - **生成动态链接库**:使用C++编译器(如g++)编译源码,并链接到JNI库,生成适用于目标操作系统...

Global site tag (gtag.js) - Google Analytics