本篇文章小编给大家分享一下Java调用C++程序代码实现方式,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看。
Java调用C++程序
1、编写Java程序:HelloWorld
代码如下:
package HelloWorld; public class HelloWorld { public native void sayHello(); public static void main(String[] args) { System.loadLibrary("Win32Project1"); HelloWorld tNative = new HelloWorld(); tNative.sayHello(); } }
2、Windows环境下,在cmd中编译以上程序
编译通过后,使用 javah -jni HelloWorld.HelloWorld命令,在src文件夹下生成HelloWorld_HelloWorld.h文件(注意,此处我写的两个HelloWorld,前一个指包名,后一个指类名,由于我是写在eclipse中的,所以需要写明包名和类名,这样在cmd中编译、运行时才不会报错)。
在执行完这一步后,能够看到HelloWorld.java、HelloWorld.class、HelloWorld_HelloWorld.h这三个文件是位于同一个src文件夹下的,如下图所示(注意,此处的src文件夹是在eclipse中创建HelloWorld这个java project时自动生成的,并非手动创建的):
3、编写C++程序
打开Visual Studio 2013,执行“文件—>新建—>项目—>Visual C++—>Win32 项目—>确定—>下一步–>选择DLL(D)–>完成”。
注意,设置好项目名称以及项目文件所在的位置,如下图标红处所示:
创建好项目之后,将之前生成的HelloWorld_HelloWorld.h头文件添加到项目的“头文件”中,并在源文件中添加helloworld.cpp这一文件,如下图所示:
接下来,在helloworld.cpp文件中输入以下代码:
// helloworld.cpp : 定义DLL应用程序的导出函数。 // #include "stdafx.h" #include "HelloWorld_HelloWorld.h" #includeusing namespace std; JNIEXPORT void JNICALL Java_HelloWorld_HelloWorld_sayHello(JNIEnv *, jobject) { cout << "hello world" << endl; }
右键该项目的项目名,选择“生成”。注意,此时会报错‘error C1083: 无法打开包括文件: “jni.h”: No such file or directory’,解决的办法是:将你电脑上Java文件夹下,jdk目录的include目录下的jni.h文件(比如,D:Javajdk1.8.0_144include)以及win32目录下的jni_md.h文件(比如,D:Javajdk1.8.0_144includewin32)都拷贝到Visual Studiovcinclude目录下即可解决该问题。然后再次右键项目名称,选择“生成”。
4、完成以上步骤后
打开你Visual Studio的C++项目源文件所在的文件夹(也就是在创建C++项目时你所选择的“位置”的目录),将Debug目录下的dll文件拷贝到Java文件夹下,jdk目录的bin目录中,如下图所示:
5、重新编译HelloWorld.java程序
运行,即可得到Hello World这个结果。
Java与C++的互调
C++调用Java
1)Unix环境下安装jdk,并且设置jdk和jre的环境变量,如下:
JRE_HOME=/usr/java/jdk1.6.0_04/jre CLASS_PATH=.:/usr/java/jdk1.6.0_04/lib/dt.jar:/usr/java/jdk1.6.0_04/lib/tools.jar JAVA_HOME=/usr/java/jdk1.6.0_04 LD_LIBRARY_PATH=/usr/java/jdk1.6.0_04/jre/lib/amd64:/usr/java/jdk1.6.0_04/jre/lib/amd64/server PATH=/usr/java/jdk1.6.0_04/bin
2)编写java测试程序,代码如下:
编译,生成MyTest.jar,将jar放到unix环境测试目录下。
3)编写c++测试代码
其中JNI_CreateJavaVM表示创建java虚拟机环境,
FindClass获取需要调用的类,
GetMethodID获取类中的方法;
CallStaticIntMethod获取返回整型静态方法;
CallBooleanMethod获取返回布尔类型方法
DestroyJavaVM释放虚拟机。
stoJstring和jstringTostring函数,是将jvm中类型与c++类型转换。
调用类中的方法GetMethodID调用时,第三个参数“(II)I”表示方法的输入输出参数类型,
“()”里面的标识输入参数类型,括号外面的表示输出参数类型。参数类型查看,可以根据编译的.class文件,使用命令javap -s -p 类名查看,如下图:
注意:一个进程中只能启动一个java虚拟机。
4)编译与运行
编译时设置相关的头文件和库文件路径,编译命令:g++ testjava.cpp -o testjava -I${JAVA_HOME}/include-I${JAVA_HOME}/include/linux -L${JRE_HOME}/lib/amd64/server –ljvm
运行结果如下:
Java调用C++
1)编写java代码,如下:
使用native标识方法由c++实现;
System.loadLibrary表示加载c++库,示例中加载的库文件为libMyTest.so
2)将java文件编译成.class文件,使用javah命令,根据class文件生成c++的接口头文件
此时生成MyTest.h文件,内容如下:
3)编写接口函数的实现,如下:
4)编译c++文件,生成库文件
这时生成了libMyTest.so库文件。
配置库文件到环境变量中
exportLD_LIBRARY_PATH=$LD_LIBRARY_PATH:/export/home/process/PM/testjava
5)将java程序的jar文件放到同一个目录下,运行jar,运行结果如下,此时调用的sub函数,是C++程序实现的。
忍者必须死34399账号登录版 最新版v1.0.138v2.0.72
下载勇者秘境oppo版 安卓版v1.0.5
下载忍者必须死3一加版 最新版v1.0.138v2.0.72
下载绝世仙王官方正版 最新安卓版v1.0.49
下载Goat Simulator 3手机版 安卓版v1.0.8.2
Goat Simulator 3手机版是一个非常有趣的模拟游
Goat Simulator 3国际服 安卓版v1.0.8.2
Goat Simulator 3国际版是一个非常有趣的山羊模
烟花燃放模拟器中文版 2025最新版v1.0
烟花燃放模拟器是款仿真的烟花绽放模拟器类型单机小游戏,全方位
我的世界动漫世界 手机版v友y整合
我的世界动漫世界模组整合包是一款加入了动漫元素的素材整合包,
我的世界贝爷生存整合包 最新版v隔壁老王
我的世界MITE贝爷生存整合包是一款根据原版MC制作的魔改整