C++与Java混合编程 偏执的太偏执、 2022-05-12 15:50 166阅读 0赞 ### C++与Java混合编程 ### * 文章概要: * 现在的程序员,不再像以前一样,掌握一种编程语言就可以混得有模有样了,现实的情况是,真实的项目中,通常是涉及多种编程语言,举几个简单的例子,一个软件为了快速开发,可能是使用Delphi或VB作为界面开发首选语言,底层的指令或核心算法,会使用C/C++处理,涉及数据处理的时候,为了安全和快速开发,会使用Javascript或Python等脚本语言实现数据分析处理。因此,开发者应该学习或掌握语言混合编程。 C++和Java是主流的两种编程语言,但是现在整个网上对实现这两种语言混合编程的资料少之又少,却又说之不全,并且有时多种问题现在也含糊不清,对正在学习或使用这两种语言的朋友造成很大的困扰。本人的这篇拙作,希望对使用这两种语言混合编程学习的朋友可以抛砖引玉。 现在的程序员,不再像以前一样,掌握一种编程语言就可以混得有模有样了,现实的情况是,真实的项目中,通常是涉及多种编程语言,举几个简单的例子,一个软件为了快速开发,可能是使用Delphi或VB作为界面开发首选语言,底层的指令或核心算法,会使用C/C++处理,涉及数据处理的时候,为了安全和快速开发,会使用Javascript或Python等脚本语言实现数据分析处理。因此,开发者应该学习或掌握语言混合编程。 C++和Java是主流的两种编程语言,但是现在整个网上对实现这两种语言混合编程的资料少之又少,却又说之不全,并且有时多种问题现在也含糊不清,对正在学习或使用这两种语言的朋友造成很大的困扰。本人的这篇拙作,希望对使用这两种语言混合编程学习的朋友可以抛砖引玉。 实现原理 实现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++安装目录设置以下的环境变量 ![img_20120505114740.jpg][] 注意不要缺少Java的include和lib这三个红线标出部分(为源码包文件中的cpp-env.Bat这个批处理文件)。 设置Java的环境变量,如下图所示 ![img_20120505114852.jpg][] 注意红线标注的这处部分,这部分与C++调用Java的方法时候影响非常重要(为源码包文件中的java-env.Bat这个批处理文件)。 在command模式运行这两个批处理文件后,就可以在command模式运行demo程序了。 Java调用C++的方法 源码文件中 **%SRC%/Java-cpp**目录中的WinFile.java的这个文件(Java语法规定类名与文件名必须一致),定义了一个WinFile类,这个类的内容如下 ![img_20120505114926.jpg][] 在代码的第18行,声明一个带native属性的方法GetFilesFromDir,这个方法传入一个字符类参数,并返回一个字符类参数,而System.loadLibrary则会加载指定的共享链接库,参数所示加载的动态库为libwinfile.dll,在windows平台上,执行时会自动加入后缀.dll。 在command模式运行以下命令: ![img_20120505115012.jpg][] 第一条命令则会生成WinFile.class的编译文件,而第二条命令则会生成WinFile.h这个头文件,这个头文件包含了WinFile.java中的native的方法的C/C++语言的定义。 ![img_20120505115047.jpg][] 在C/C++的语言定中,Java语言的String的定义为jstring,注意,Java的语言的字符与程序的编码都是以UTF-8编码实现的,所以Java中的中文字符在C++的方法中如果没有编码转换,则会显示为乱码。同理,在C++的方法中将中文字符返回给Java,如果没有将字符编码转为UTF-8,在Java的方法显示同样会是乱码。 ![img_20120505115130.jpg][] 以上为**%SRC%/Java-cpp/WinFile.cpp**的部分代码,代码中实现了两个函数,一个是将UTF-8转为GB2312,另一个为将GB2312转为UTF-8,而jni.h这个头文件中也同时提供了jstring与char\*的类型之间转换函数。 `1.` `GetStringUTFChars NewStringUTF` 运行如下编译命令: `1.` `cl -GX -LD WinFile.cpp -FelibWinFile.dll` 则生成libWinFile.dll这个动态库(注意,生成的名称要与System.loadLibrary这个函数内的参数的名称一致),运行这个Java的类。 则输出如下 ![img_20120505115215.jpg][] C++调用Java类方法 这里演示String作为参数的调用返回的方法,其它的类型的方法调用也类似。 创建一个静态声明的Java方法 ![img_20120505115238.jpg][] 这个方法将会接受一个C++的传入的字符参数,并返回Java的字符类,让C++函数输出内容。代码位于**%SRC%/cpp-java/WinFile.java** 编译该文件后生成是一个java字节码的文件,它必须要运在JVM上,C++要执这些Java字节码,必须要运行JVM,运行JVM的代码位于文件**%SRC%/cpp-java/WinFile.cpp**中,如下图所示 ![img_20120505115308.jpg][] 通过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这个动态库加入的搜索路径中,如上面的批处理文件所示。 ![img_20120505115454.jpg][] 成功建立Java虚拟机后,就需要动态获得类名,并通过类名和函数签名获得Java的方法,获得函数签名的方法是运行如下命令。 `1.` `Java -s -p WinFile` 则输出了我们在Java文件中定义的函数的签名, ![img_20120505115556.jpg][] 剩下的事情就是要负责将字符的参数进行编码调用,如下图标注出值得注意的地方 ![img_20120505115649.jpg][] 参数的转换过程是为char\*转为UTF8编码再转变成为jstring伟入java方法,java方法的返回值也应该是先转成jstring类型,再转为char\*类型再转为GB2312。运行程序,输出结果如下 ![img_20120505115713.jpg][] 总结 混合语言编程要注意的是编码传输,语言运行环境的因素。例如要在C++中构造Java的运行环境。混合语言编程有困难,但也很有趣,两种语言的优点都可以得到,不是很好的事情吗? [img_20120505114740.jpg]: /images/20220504/1cee4761c40a42ebb5844c146e913d3b.png [img_20120505114852.jpg]: /images/20220504/4564bc6341b6468e84ff891c1bf517ec.png [img_20120505114926.jpg]: /images/20220504/66322de4f7064415816f01b2a00a93c5.png [img_20120505115012.jpg]: /images/20220504/b97862d8f2bb47beb780b1edd2ae0238.png [img_20120505115047.jpg]: /images/20220504/fb7a1485613f4e37b9e117f8506e30b4.png [img_20120505115130.jpg]: /images/20220504/d0127979f3154d8d8c27569394d4ee0e.png [img_20120505115215.jpg]: /images/20220504/a94985ae857f4ad4afd91c8fc01690e0.png [img_20120505115238.jpg]: /images/20220504/4a53dbc12d714cbfb22fb09c6f8bc1b7.png [img_20120505115308.jpg]: /images/20220504/84f9623dd371454fb7b952da4fa09e0c.png [img_20120505115454.jpg]: /images/20220504/bdcc2e57ee404287850cc9d957f0e91a.png [img_20120505115556.jpg]: /images/20220504/8b56e01c2aeb4ef4a3d62030a93b47be.png [img_20120505115649.jpg]: /images/20220504/5aea2ea406a741dba72be96d48f96085.png [img_20120505115713.jpg]: /images/20220504/4c0e45df9b5645c683da31b1228c428b.png
相关 Java与C++混合编程案例解析 Java和C++混合编程在实际项目中常常会出现,比如需要使用Java的面向对象特性,同时又有一些性能要求较高的部分需要用到C++。以下是一个简单的混合编程案例分析: 1. * 缺乏、安全感/ 2024年09月11日 13:30/ 0 赞/ 16 阅读
相关 Lua与C语言混合编程:Lua调用C库编程 在软件开发中,有时候需要在Lua脚本中使用C语言编写的库函数来提供更高效的计算和底层操作。Lua提供了强大的扩展能力,可以通过调用C库函数来扩展Lua的功能。本文将介绍如何使用 逃离我推掉我的手/ 2024年02月24日 03:52/ 0 赞/ 12 阅读
相关 Object C与 C/C++混合编程 本文介绍下object c和C/C++混合编程。 首先介绍文件类型和可识别的代码类型。 .m文件 : 可识别object c , c代码 .mm文件: 可识别object 分手后的思念是犯贱/ 2022年09月30日 14:49/ 0 赞/ 153 阅读
相关 Matlab与C/C++混合编程(mex文件) Matlab是一种矩阵语言,是为vector和matrix操作设计的,这两种类型的运算速度非常快,但是当涉及到大量的循环处理时,Matlab的速度就有点慢了。因此,Matlab 阳光穿透心脏的1/2处/ 2022年08月27日 11:41/ 0 赞/ 167 阅读
相关 java和c++混合编程尝试 [下载源代码][Link 1] 现在的程序员,不再像以前一样,掌握一种编程语言就可以混得有模有样了,现实的情况是,真实的项目中,通常是涉及多种编程语言,举几个简单的例子 我不是女神ヾ/ 2022年08月27日 03:40/ 0 赞/ 158 阅读
相关 C/C++混合编程 前段时间,碰到了C,C++混合编程的需求,经过努力,顺利解决问题.现把这方面的知识做一下简单的总结: 1.当C++文件要用到C语言中的函数代码时,采用下属方法即可: 在C+ 女爷i/ 2022年06月09日 02:14/ 0 赞/ 170 阅读
相关 c#与matlab混合编程探索 转自: [农夫渔夫 ][Link 1] [以下讲述如何使用c\来调用matlab函数实现北斗定位算法的仿真][Link 1] [1.准备][Link 1] [首先需要 清疚/ 2022年05月31日 02:17/ 0 赞/ 221 阅读
相关 C++与Java混合编程 C++与Java混合编程 文章概要: 现在的程序员,不再像以前一样,掌握一种编程语言就可以混得有模有样了,现实的情况是,真实的项目中,通常是涉及多种 偏执的太偏执、/ 2022年05月12日 15:50/ 0 赞/ 167 阅读
相关 matlab与C语言混合编程 要使用matlab来调用C或者C++写的代码就必须要配置环境,matlab是用mex来编译C或者C++代码的,编译生成.mexw64或者.mexw32为后缀的文件,matlab Love The Way You Lie/ 2021年12月12日 07:31/ 0 赞/ 291 阅读
还没有评论,来说两句吧...