JAVA與C++::關於JNI中文字串操作問題總結

來源:互聯網
上載者:User

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%/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)自己仔細看看上面的代碼就可以了.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.