C++与Java混合编程_第1页
C++与Java混合编程_第2页
C++与Java混合编程_第3页
C++与Java混合编程_第4页
C++与Java混合编程_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、.C+与Java混合编程作者:赖锋下载源代码现在的程序员,不再像以前一样,掌握一种编程语言就可以混得有模有样了,现实的情况是,真实的项目中,通常是涉及多种编程语言,举几个简单的例子,一个软件为了快速开发,可能是使用Delphi或VB作为界面开发首选语言,底层的指令或核心算法,会使用C/C+处理,涉及数据处理的时候,为了安全和快速开发,会使用Javascript或Python等脚本语言实现数据分析处理。因此,开发者应该学习或掌握语言混合编程。 C+和Java是主流的两种编程语言,但是现在整个网上对实现这两种语言混合编程的资料少之又少,却又说之不全,并且有时多种问题现在也含糊不清,对正在学习或使用

2、这两种语言的朋友造成很大的困扰。本人的这篇拙作,希望对使用这两种语言混合编程学习的朋友可以抛砖引玉。实现原理实现Java和C+的交互,使用的技术是称为JNI( Java Native Interface ),C+编写的程序,只要实现JNI生成的接口,则可以让Java程序调用,而Java编写的程序,C+调用,则需要运行Java虚拟机,通过JNI查询调用Java实现的方法。 环境变量设置本文中使用的Java的版本是( build 1.6.0_03-b05 ),C+的版本为VC+ 6.0版本。并根据你本机上的Java和C+安装目录设置以下的环境变量注意不要缺少Java的include和lib这三个红

3、线标出部分(为源码包文件中的cpp-env.Bat这个批处理文件)。 设置Java的环境变量,如下图所示 注意红线标注的这处部分,这部分与C+调用Java的方法时候影响非常重要(为源码包文件中的java-env.Bat这个批处理文件)。 在command模式运行这两个批处理文件后,就可以在command模式运行demo程序了。 Java调用C+的方法 源码文件中 %SRC%/Java-cpp目录中的WinFile.java的这个文件(Java语法规定类名与文件名必须一致),定义了一个WinFile类,这个类的内容如下 在代码的第18行,声明一个带native属性的方法GetFilesFromD

4、ir,这个方法传入一个字符类参数,并返回一个字符类参数,而System.loadLibrary则会加载指定的共享链接库,参数所示加载的动态库为libwinfile.dll,在windows平台上,执行时会自动加入后缀.dll。 在command模式运行以下命令: 第一条命令则会生成WinFile.class的编译文件,而第二条命令则会生成WinFile.h这个头文件,这个头文件包含了WinFile.java中的native的方法的C/C+语言的定义。 在C/C+的语言定中,Java语言的String的定义为jstring,注意,Java的语言的字符与程序的编码都是以UTF-8编码实现的,所以J

5、ava中的中文字符在C+的方法中如果没有编码转换,则会显示为乱码。同理,在C+的方法中将中文字符返回给Java,如果没有将字符编码转为UTF-8,在Java的方法显示同样会是乱码。 以上为%SRC%/Java-cpp/WinFile.cpp的部分代码,代码中实现了两个函数,一个是将UTF-8转为GB2312,另一个为将GB2312转为UTF-8,而jni.h这个头文件中也同时提供了jstring与char*的类型之间转换函数。 GetStringUTFChars NewStringUTF 运行如下编译命令: cl -GX -LD WinFile.cpp -FelibWinFile.dll 则生

6、成libWinFile.dll这个动态库(注意,生成的名称要与System.loadLibrary这个函数内的参数的名称一致),运行这个Java的类。 则输出如下 C+调用Java类方法 这里演示String作为参数的调用返回的方法,其它的类型的方法调用也类似。 创建一个静态声明的Java方法 这个方法将会接受一个C+的传入的字符参数,并返回Java的字符类,让C+函数输出内容。代码位于%SRC%/cpp-java/WinFile.java 编译该文件后生成是一个java字节码的文件,它必须要运在JVM上,C+要执这些Java字节码,必须要运行JVM,运行JVM的代码位于文件%SRC%/cpp

7、-java/WinFile.cpp中,如下图所示 通过JNI_CreateJavaJVM这个函数,C+则会运行JVM,注意,生成的WinFile.exe这个文件提示需要jvm.dll,但是千万不要将jvm.dll从jre这个目录拷贝到WinFile.exe这个目录,因为jvm能够正常运行,必须依赖jre的java库和其它的动态库,虽然从dependency看不出jvm.dll依赖jre中的其它库和文件。如果把jvm.dll抽离出来与WinFile.exe位于同一目录,虽然能够运行,但JNI_CreateJavaJVM调用永远失败的。解决方法,就是将jvm.dll这个动态库加入的搜索路径中,如上面的批处理文件所示。 成功建立Java虚拟机后,就需要动态获得类名,并通过类名和函数签名获得Java的方法,获得函数签名的方法是运行如下命令。 Java -s -p WinFile 则输出了我们在Java文件中定义的函数的签名, 剩下的事情就是要负责将字符的参数进行编码调用,如下图标注出值得注意的地方 参数的转换过程是为char*转为UTF8编码再转变成为jstring伟入java方法,java方法的返回值也应该是先转成jstring类型

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论