⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 java与cc++之间通过jni传递中文字符串 - 爱睇资讯 - 博客园.htm

📁 java调用JNI中解决中文符串问题
💻 HTM
📖 第 1 页 / 共 5 页
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0064)http://www.cnblogs.com/rookieport/archive/2005/10/18/257154.html -->
<HTML><HEAD id=Head><TITLE>Java与C\C++之间通过JNI传递中文字符串 - 爱睇资讯 - 博客园</TITLE>
<META http-equiv=Content-Type content="text/html; charset=utf-8">
<META id=metaKeywords content=Java与C,C,之间通过JNI传递中文字符串 name=keywords>
<META 
content=Java与C之间通过JNI传递中文字符串简介本文提供一个具体的实例,说明Java和C之间通过JNI传递含有中文字符串的参数,解决中文乱码问题(双字节或多字节乱码)。本文给出具体的源代码,对源代码进行了解释,C部分提供了C和C++两种方式实现的完整代码。并且所有代码均在实验环境下测试通过。本文读者 
name=description><LINK id=CommondCss 
href="Java与CC++之间通过JNI传递中文字符串 - 爱睇资讯 - 博客园.files/common.css" type=text/css 
rel=stylesheet><LINK id=MainCss 
href="Java与CC++之间通过JNI传递中文字符串 - 爱睇资讯 - 博客园.files/style.css" type=text/css 
rel=stylesheet><LINK id=CommondCss2 
href="Java与CC++之间通过JNI传递中文字符串 - 爱睇资讯 - 博客园.files/common2.css" type=text/css 
rel=stylesheet><LINK id=RSSLink title=RSS 
href="http://www.cnblogs.com/rookieport/rss" type=application/rss+xml 
rel=alternate>
<SCRIPT src="Java与CC++之间通过JNI传递中文字符串 - 爱睇资讯 - 博客园.files/common.js" 
type=text/javascript></SCRIPT>

<META content="MSHTML 6.00.2900.5726" name=GENERATOR></HEAD>
<BODY>
<FORM id=Form1 name=Form1 onsubmit="javascript:return WebForm_OnSubmit();" 
action=257154.html method=post>
<DIV><INPUT id=__EVENTTARGET type=hidden name=__EVENTTARGET> <INPUT 
id=__EVENTARGUMENT type=hidden name=__EVENTARGUMENT> <INPUT 
id="&#13;&#10;__VIEWSTATE" type=hidden name=__VIEWSTATE> </DIV>
<SCRIPT type=text/javascript>
//<![CDATA[
var theForm = document.forms['Form1'];
if (!theForm) {
    theForm = document.Form1;
}
function __doPostBack(eventTarget, eventArgument) {
    if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
        theForm.__EVENTTARGET.value = eventTarget;
        theForm.__EVENTARGUMENT.value = eventArgument;
        theForm.submit();
    }
}
//]]>
</SCRIPT>

<SCRIPT src="Java与CC++之间通过JNI传递中文字符串 - 爱睇资讯 - 博客园.files/WebResource.axd" 
type=text/javascript></SCRIPT>

<SCRIPT language=JavaScript>
									function ctlent(evt,id)
											{
												if(evt.ctrlKey && evt.keyCode == 13)
												{	
													try
													{
														TempSave(id);
													}
													catch(ex)
													{
													}
													finally
													{
													    __doPostBack('AjaxHolder$PostComment$btnSubmit','')
													}
												}
		
												}</SCRIPT>

<SCRIPT language=JavaScript>function SetReplyAuhor(author){document.getElementById('AjaxHolder_PostComment_tbComment').value+="@"+author+"\n";document.getElementById('AjaxHolder_PostComment_tbComment').focus();return false}</SCRIPT>

<SCRIPT src="Java与CC++之间通过JNI传递中文字符串 - 爱睇资讯 - 博客园.files/ScriptResource.axd" 
type=text/javascript></SCRIPT>

<SCRIPT 
src="E:\work\word\中文字符jni\Java与CC++之间通过JNI传递中文字符串 - 爱睇资讯 - 博客园.files\ScriptResource(1).axd" 
type=text/javascript></SCRIPT>

<SCRIPT 
src="E:\work\word\中文字符jni\Java与CC++之间通过JNI传递中文字符串 - 爱睇资讯 - 博客园.files\ScriptResource(2).axd" 
type=text/javascript></SCRIPT>

<SCRIPT src="Java与CC++之间通过JNI传递中文字符串 - 爱睇资讯 - 博客园.files/js" 
type=text/javascript></SCRIPT>

<SCRIPT type=text/javascript>
//<![CDATA[
function WebForm_OnSubmit() {
if (typeof(ValidatorOnSubmit) == "function" && ValidatorOnSubmit() == false) return false;
return true;
}
//]]>
</SCRIPT>
<!--done-->
<TABLE cellSpacing=0 cellPadding=0 width="100%" align=center border=0>
  <TBODY>
  <TR>
    <TD width=299 
    background="Java与CC++之间通过JNI传递中文字符串 - 爱睇资讯 - 博客园.files/banner1.jpg"></TD>
    <TD background="Java与CC++之间通过JNI传递中文字符串 - 爱睇资讯 - 博客园.files/banner.jpg"><!--done-->
      <DIV class=header>
      <DIV class=headerText><A class=headermaintitle id=Header1_HeaderTitle 
      href="http://www.cnblogs.com/rookieport/">爱睇资讯</A><BR>IT资讯,最新最前沿。我们的口号:能解决实际问题的软件才是好软件! 
      <A onmouseover="" 
      href="http://www.kaixin001.com/reg/?uid=3657745&amp;usercode=915b6d65921b00a2907a8f95d80ce326_3657745" 
      target=_blank>欢迎加入开心网</A> </DIV></DIV></TD>
    <TD width=296 
    background="Java与CC++之间通过JNI传递中文字符串 - 爱睇资讯 - 博客园.files/banner2.jpg"></TD></TR></TBODY></TABLE>
<DIV id=mylinks><!--done--><A class=menu id=MyLinks1_HomeLink 
href="http://www.cnblogs.com/">博客园</A>&nbsp;&nbsp;&nbsp; <A class=menu 
id=MyLinks1_MyHomeLink 
href="http://www.cnblogs.com/rookieport/">首页</A>&nbsp;&nbsp;&nbsp; <A class=menu 
href="http://space.cnblogs.com/">社区</A>&nbsp;&nbsp;&nbsp; <A class=menu 
id=MyLinks1_NewArticleLink 
href="http://www.cnblogs.com/EnterMyBlog.aspx?NewArticle=1">新文章</A>&nbsp;&nbsp;&nbsp; 
<A class=menu id=MyLinks1_NewPostLink 
href="http://www.cnblogs.com/rookieport/admin/EditPosts.aspx?opt=1">新随笔</A>&nbsp;&nbsp;&nbsp; 
<A class=menu id=MyLinks1_Syndication 
href="http://www.cnblogs.com/rookieport/rss">订阅</A><A id=MyLinks1_XMLLink 
href="http://www.cnblogs.com/rookieport/rss"><IMG 
style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" 
alt=订阅 
src="Java与CC++之间通过JNI传递中文字符串 - 爱睇资讯 - 博客园.files/xml.gif"></A>&nbsp;&nbsp;&nbsp; 
<A class=menu id=MyLinks1_Admin 
href="http://www.cnblogs.com/rookieport/admin/EditPosts.aspx">管理</A> <!-- <a id="MyLinks1_ContactLink" accesskey="9" class="menu" href="http://www.cnblogs.com/rookieport/contact.aspx?id=1">联系</a>&nbsp;&nbsp;&nbsp; --></DIV>
<DIV id=mytopmenu>
<DIV id=mystats><!--done-->
<DIV class=blogStats>posts - 478,&nbsp; comments - 538,&nbsp; trackbacks - 42 
</DIV></DIV></DIV>
<DIV id=centercontent>
<SCRIPT type=text/javascript>
//<![CDATA[
Sys.WebForms.PageRequestManager._initialize('AjaxHolder$scriptmanager1', document.getElementById('Form1'));
Sys.WebForms.PageRequestManager.getInstance()._updateControls(['tAjaxHolder$UpdatePanel1'], [], [], 90);
//]]>
</SCRIPT>
<!--done-->
<DIV class=post>
<DIV class=postTitle><A class=postTitle2 id=AjaxHolder_ctl01_TitleUrl 
href="http://www.cnblogs.com/rookieport/archive/2005/10/18/257154.html">Java与C\C++之间通过JNI传递中文字符串</A> 
</DIV>Java与C之间通过JNI传递中文字符串<BR>简介 
<BR>本文提供一个具体的实例,说明Java和C之间通过JNI传递含有中文字符串的参数,解决中文乱码问题(双字节或多字节乱码)。本文给出具体的源代码,对源代码进行了解释,C部分提供了 
C和C++两种方式实现的完整代码。并且所有代码均在实验环境下测试通过。本文读者须对Java和C(或C++)有一定的基础知识。<BR>实验环境<BR>Windows 
XP (或Windows2000)<BR>j2sdk1.4.2/j2re1.4.2<BR>Microsoft 
VisualC++6.0<BR>安装好j2sdk后需要设置环境变量 
<BR>CLASSPATH=.;C:\j2sdk1.4.2\bin;C:\j2sdk1.4.2\lib\dt.jar;C:\j2sdk1.4.2\lib\tools.jar;C:\j2sdk1.4.2\lib\htmlconverter.jar(j2sdk安装在c:\j2sdk1.4.2目录下)<BR>源代码及代码说明<BR>Java代码:<BR>/*<BR>* 
javactransfer.java<BR>* By dpwu<BR>* e-mail:<A 
href="mailto:dpwu_js@sina.com.cn"><FONT 
color=#003366>dpwu_js@sina.com.cn</FONT></A><BR>*/<BR>public class 
javactransfer<BR>{<BR>&nbsp;&nbsp;public String hypotenuse(String 
send_buf,String recv_buf,int errno)<BR>&nbsp;&nbsp;{<BR>&nbsp; &nbsp; return 
hypotenuse0(send_buf,recv_buf,errno);<BR>&nbsp;&nbsp;}<BR><BR>&nbsp;&nbsp;private 
native String&nbsp;&nbsp;hypotenuse0(String send_buf,String recv_buf,int 
errno);<BR><BR>&nbsp;&nbsp;static<BR>&nbsp;&nbsp;{<BR>&nbsp; &nbsp; 
System.loadLibrary("javactransfer");//调用dll<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;public 
static void main( String[] args )<BR>&nbsp;&nbsp;{<BR><BR>&nbsp; 
&nbsp;&nbsp;&nbsp;javactransfer obj= new javactransfer();<BR>&nbsp; 
&nbsp;&nbsp;&nbsp;System.out.println("");<BR>&nbsp; 
&nbsp;&nbsp;&nbsp;System.out.println("");<BR>&nbsp; 
&nbsp;&nbsp;&nbsp;System.out.println("&nbsp; &nbsp;&nbsp; &nbsp; 
begin!");<BR>&nbsp; &nbsp;&nbsp;&nbsp;System.out.println("");<BR>&nbsp; 
&nbsp;&nbsp;&nbsp;System.out.println("");<BR>&nbsp; &nbsp;&nbsp;&nbsp;String 
javasend="发送中文chinese!";<BR>&nbsp; &nbsp;&nbsp;&nbsp;System.out.println(" java 
send:"+"["+javasend+"]");<BR>String 
javarecv=obj.hypotenuse("teststr",javasend,1);&nbsp;&nbsp;<BR>//javasend传含有中文字符串给C<BR>//javarecv接受C含有中的文字符串<BR>&nbsp; 
&nbsp;&nbsp;&nbsp;System.out.println(" java recv:"+"["+javarecv+"]");<BR>&nbsp; 
&nbsp;&nbsp;&nbsp;System.out.println("");<BR>&nbsp; 
&nbsp;&nbsp;&nbsp;System.out.println("");<BR>&nbsp; 
&nbsp;&nbsp;&nbsp;System.out.println("&nbsp; &nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;end!");<BR>&nbsp; 
&nbsp;}<BR>}<BR><BR><BR><BR>C实现代码为:<BR>/*<BR>* javactransfer.c<BR>* By dpwu<BR>* 
e-mail:<A href="mailto:dpwu_js@sina.com.cn"><FONT 
color=#003366>dpwu_js@sina.com.cn</FONT></A><BR>*/<BR><BR>#include 
<WINDOWS.H><BR>#include "javactransfer.h"//通过javah –jni javactransfer 
生成<BR>#include <STDIO.H><BR>#include "stdlib.h"<BR>#include 
"string.h"<BR><BR>char* jstringToWindows( JNIEnv *env, jstring jstr 
);<BR>jstring WindowsTojstring( JNIEnv* env, char* str );<BR><BR>JNIEXPORT 
jstring JNICALL <BR>Java_javactransfer_hypotenuse0(JNIEnv *env,jobject 
obj,jstring send_buf,jstring recv_buf,jint errno)<BR>{<BR>&nbsp;&nbsp;char * 
Buf_Return;<BR><BR>&nbsp;&nbsp;Buf_Return&nbsp;&nbsp;=&nbsp;&nbsp;(char*)malloc(1024); 
<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;const char * recvtest = jstringToWindows( env, 
recv_buf );<BR>/*上句recvtest接收Java传过来的中文字符串正确,如果改为下句,则出现乱码:<BR>const char * 
recvtest = (*env)-&gt;GetStringUTFChars( 
env,recv_buf,0);&nbsp;&nbsp;<BR>*/<BR>printf( " 
c&nbsp;&nbsp;recv&nbsp;&nbsp;:[%s]\n" , 
recvtest);<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;sprintf(Buf_Return,"接收中文chinese!");<BR>&nbsp;&nbsp;printf( 
"\n\n\n c send&nbsp; &nbsp;:[%s]\n" , Buf_Return); <BR>&nbsp;&nbsp;recv_buf = 
WindowsTojstring(env 
,Buf_Return);<BR>/*上句recv_buf传windows本地C中含有中文字符串给Java正确;如果改为下句出现乱码:<BR>recv_buf 
= (*env)-&gt;NewStringUTF( env, Buf_Return 
);<BR>&nbsp;&nbsp;*/<BR>&nbsp;&nbsp;return recv_buf;<BR>}<BR>char* 
jstringToWindows( JNIEnv&nbsp;&nbsp;*env, jstring jstr )<BR>{<BR>&nbsp;&nbsp;int 
length = (*env)-&gt;GetStringLength(env,jstr );<BR>&nbsp;&nbsp;const jchar* 
jcstr = (*env)-&gt;GetStringChars(env,jstr, 0 );<BR>&nbsp;&nbsp;char* rtn = 
(char*)malloc( length*2+1 );<BR>&nbsp;&nbsp;int size = 0;<BR>&nbsp;&nbsp;size = 
WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)jcstr, length, rtn,(length*2+1), NULL, 
NULL );<BR>&nbsp;&nbsp;if( size &lt;= 0 )<BR>&nbsp; &nbsp; return 
NULL;<BR>&nbsp;&nbsp;(*env)-&gt;ReleaseStringChars(env,jstr, jcstr 
);<BR>&nbsp;&nbsp;rtn[size] = 0;<BR>&nbsp;&nbsp;return rtn;<BR>}<BR><BR>jstring 
WindowsTojstring( JNIEnv* env, char* str )<BR>{<BR>&nbsp;&nbsp;jstring rtn = 
0;<BR>&nbsp;&nbsp;int slen = strlen(str);<BR>&nbsp;&nbsp;unsigned short* buffer 
= 0;<BR>&nbsp;&nbsp;if( slen == 0 )<BR>&nbsp; &nbsp; rtn = 
(*env)-&gt;NewStringUTF(env,str ); 
<BR>&nbsp;&nbsp;else<BR>&nbsp;&nbsp;{<BR>&nbsp; &nbsp; int length = 
MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, NULL, 0 );<BR>&nbsp; &nbsp; 
buffer = malloc( length*2 + 1 );<BR>&nbsp; &nbsp; if( MultiByteToWideChar( 
CP_ACP, 0, (LPCSTR)str, slen, (LPWSTR)buffer, length ) &gt;0 )<BR>&nbsp; 
&nbsp;&nbsp; &nbsp;rtn = (*env)-&gt;NewString( env, (jchar*)buffer, length 
);<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;if( buffer )<BR>&nbsp;&nbsp;free( buffer 
);<BR>&nbsp;&nbsp;return 
rtn;<BR>}<BR>若javactransfer.java,javactransfer.c均放在d:\javac目录下,<BR>然后执行<BR>(此处图片不能上传)<BR><BR>javac 
javactransfer.java :编译java源代码;<BR>javah –jni javactransfer :生成头文件;<BR>cl 
-Ic:\j2sdk1.4.2\include -Ic:\j2sdk1.4.2\include\win32&nbsp;&nbsp;-LD 
javactransfer.c -Fejavactransfer.dll<BR>通过Microsoft Visual 
C++将C源代码生成dll文件,供java调用。<BR>执行结果如下:<BR>(此处图片不能上传)<BR>执行键入:java javactranfer 
<BR><BR>C++实现代码为:<BR>/*<BR>* javactransfer.cpp<BR>* By dpwu<BR>* e-mail:<A 
href="mailto:dpwu_js@sina.com.cn"><FONT 
color=#003366>dpwu_js@sina.com.cn</FONT></A><BR>*/<BR><BR>#include 
<WINDOWS.H><BR>#include "javactransfer.h"//通过javah –jni javactransfer 
生成<BR>#include <STDIO.H><BR>#include "stdlib.h"<BR>#include 
"string.h"<BR><BR>char* jstringToWindows( JNIEnv *env, jstring jstr 
);<BR>jstring WindowsTojstring( JNIEnv* env, char* str );<BR><BR>JNIEXPORT 
jstring JNICALL <BR>Java_javactransfer_hypotenuse0(JNIEnv *env,jobject 
obj,jstring send_buf,jstring recv_buf,jint 
_tperrno)<BR><BR>{<BR>&nbsp;&nbsp;char * 
Buf_Return;<BR>&nbsp;&nbsp;Buf_Return&nbsp;&nbsp;=&nbsp;&nbsp;(char*)malloc(1024); 
<BR><BR>&nbsp;&nbsp;const char * ctest = jstringToWindows( env, recv_buf 
);<BR>/*<BR>&nbsp;&nbsp;如果把上句改为下句,C接收Java字符串时将出现乱码:<BR>&nbsp;&nbsp;const char 
*ctest = (env)-&gt;GetStringUTFChars(&nbsp;&nbsp;recv_buf , 
0);<BR>*/<BR>&nbsp;&nbsp;printf( " c&nbsp;&nbsp;recv&nbsp;&nbsp;:[%s]\n" , 
ctest);<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;sprintf(Buf_Return,"接收中文chinese!");<BR>&nbsp;&nbsp;printf( 
"\n\n\n c send&nbsp; &nbsp;:[%s]\n" , Buf_Return); <BR>&nbsp;&nbsp;recv_buf = 
WindowsTojstring(env 
,Buf_Return);<BR>/*上句执行正确,如果把上句换成下句,Java在接收C字符串时出现乱码<BR>recv_buf = 
(env)-&gt;NewStringUTF(Buf_Return);<BR>*/<BR>&nbsp;&nbsp;return 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -