📄 java与cc++之间通过jni传递中文字符串 - 爱睇资讯 - 博客园.htm
字号:
<!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=" __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&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> <A class=menu
id=MyLinks1_MyHomeLink
href="http://www.cnblogs.com/rookieport/">首页</A> <A class=menu
href="http://space.cnblogs.com/">社区</A> <A class=menu
id=MyLinks1_NewArticleLink
href="http://www.cnblogs.com/EnterMyBlog.aspx?NewArticle=1">新文章</A>
<A class=menu id=MyLinks1_NewPostLink
href="http://www.cnblogs.com/rookieport/admin/EditPosts.aspx?opt=1">新随笔</A>
<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>
<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> --></DIV>
<DIV id=mytopmenu>
<DIV id=mystats><!--done-->
<DIV class=blogStats>posts - 478, comments - 538, 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> public String hypotenuse(String
send_buf,String recv_buf,int errno)<BR> {<BR> return
hypotenuse0(send_buf,recv_buf,errno);<BR> }<BR><BR> private
native String hypotenuse0(String send_buf,String recv_buf,int
errno);<BR><BR> static<BR> {<BR>
System.loadLibrary("javactransfer");//调用dll<BR> }<BR> public
static void main( String[] args )<BR> {<BR><BR>
javactransfer obj= new javactransfer();<BR>
System.out.println("");<BR>
System.out.println("");<BR>
System.out.println("
begin!");<BR> System.out.println("");<BR>
System.out.println("");<BR> String
javasend="发送中文chinese!";<BR> System.out.println(" java
send:"+"["+javasend+"]");<BR>String
javarecv=obj.hypotenuse("teststr",javasend,1); <BR>//javasend传含有中文字符串给C<BR>//javarecv接受C含有中的文字符串<BR>
System.out.println(" java recv:"+"["+javarecv+"]");<BR>
System.out.println("");<BR>
System.out.println("");<BR>
System.out.println("
end!");<BR>
}<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> char *
Buf_Return;<BR><BR> Buf_Return = (char*)malloc(1024);
<BR> <BR> const char * recvtest = jstringToWindows( env,
recv_buf );<BR>/*上句recvtest接收Java传过来的中文字符串正确,如果改为下句,则出现乱码:<BR>const char *
recvtest = (*env)->GetStringUTFChars(
env,recv_buf,0); <BR>*/<BR>printf( "
c recv :[%s]\n" ,
recvtest);<BR> <BR> sprintf(Buf_Return,"接收中文chinese!");<BR> printf(
"\n\n\n c send :[%s]\n" , Buf_Return); <BR> recv_buf =
WindowsTojstring(env
,Buf_Return);<BR>/*上句recv_buf传windows本地C中含有中文字符串给Java正确;如果改为下句出现乱码:<BR>recv_buf
= (*env)->NewStringUTF( env, Buf_Return
);<BR> */<BR> return recv_buf;<BR>}<BR>char*
jstringToWindows( JNIEnv *env, jstring jstr )<BR>{<BR> int
length = (*env)->GetStringLength(env,jstr );<BR> const jchar*
jcstr = (*env)->GetStringChars(env,jstr, 0 );<BR> char* rtn =
(char*)malloc( length*2+1 );<BR> int size = 0;<BR> size =
WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)jcstr, length, rtn,(length*2+1), NULL,
NULL );<BR> if( size <= 0 )<BR> return
NULL;<BR> (*env)->ReleaseStringChars(env,jstr, jcstr
);<BR> rtn[size] = 0;<BR> return rtn;<BR>}<BR><BR>jstring
WindowsTojstring( JNIEnv* env, char* str )<BR>{<BR> jstring rtn =
0;<BR> int slen = strlen(str);<BR> unsigned short* buffer
= 0;<BR> if( slen == 0 )<BR> rtn =
(*env)->NewStringUTF(env,str );
<BR> else<BR> {<BR> int length =
MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, NULL, 0 );<BR>
buffer = malloc( length*2 + 1 );<BR> if( MultiByteToWideChar(
CP_ACP, 0, (LPCSTR)str, slen, (LPWSTR)buffer, length ) >0 )<BR>
rtn = (*env)->NewString( env, (jchar*)buffer, length
);<BR> }<BR> if( buffer )<BR> free( buffer
);<BR> 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 -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> char *
Buf_Return;<BR> Buf_Return = (char*)malloc(1024);
<BR><BR> const char * ctest = jstringToWindows( env, recv_buf
);<BR>/*<BR> 如果把上句改为下句,C接收Java字符串时将出现乱码:<BR> const char
*ctest = (env)->GetStringUTFChars( recv_buf ,
0);<BR>*/<BR> printf( " c recv :[%s]\n" ,
ctest);<BR> <BR> sprintf(Buf_Return,"接收中文chinese!");<BR> printf(
"\n\n\n c send :[%s]\n" , Buf_Return); <BR> recv_buf =
WindowsTojstring(env
,Buf_Return);<BR>/*上句执行正确,如果把上句换成下句,Java在接收C字符串时出现乱码<BR>recv_buf =
(env)->NewStringUTF(Buf_Return);<BR>*/<BR> return
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -