返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >Java调用C++程序的实现方式
  • 434
分享到

Java调用C++程序的实现方式

2024-04-02 19:04:59 434人浏览 八月长安
摘要

目录Java调用c++程序1、编写Java程序:HelloWorld2、windows环境下,在cmd中编译以上程序3、编写C++程序4、完成以上步骤后5、重新编译HelloWorl

Java调用C++程序

这篇博文是自己在学习过程中,踩了很多坑之后,为了避免广大热爱编程的盆友再像我这样浪费太多时间,索性将自己的实现方法总结出来,以供大家参考。程序最终实现的是Hello World效果,话不多说,直接进入正题:

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"
#include<iOStream>
using 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:\Java\jdk1.8.0_144\include)以及win32目录下的jni_md.h文件(比如,D:\Java\jdk1.8.0_144\include\win32)都拷贝到Visual Studio\vc\include目录下即可解决该问题。然后再次右键项目名称,选择“生成”。

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释放虚拟机。
  • stojstringjstringTostring函数,是将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++程序实现的。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: Java调用C++程序的实现方式

本文链接: https://lsjlt.com/news/139272.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java调用C++程序的实现方式
    目录Java调用C++程序1、编写Java程序:HelloWorld2、Windows环境下,在cmd中编译以上程序3、编写C++程序4、完成以上步骤后5、重新编译HelloWorl...
    99+
    2024-04-02
  • Java如何调用C++程序
    这篇文章将为大家详细讲解有关Java如何调用C++程序,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1、编写Java程序:HelloWorld代码如下:package HelloWorld;pu...
    99+
    2023-06-29
  • Java递归调用如何实现数字的逆序输出方式
    目录java递归调用实现数字的逆序输出java逆序输出正整数总结java递归调用实现数字的逆序输出 输入一串数字,将数字逆序输出出来,如:12,运行结果为21;首先不管怎样,我们都要...
    99+
    2023-05-15
    Java递归调用 Java数字的逆序输出 Java逆序输出
  • c#调用c++的DLL的实现方法
    目录1.采用托管的方式进行调用,就和正常调用c#的dll一样2.非托管的方式进行调用C#是托管型代码,创建的对象会自动回收。C++是非托管型代码,创建的对象需要手动回收(有时不手动回...
    99+
    2024-04-02
  • Python调用C++程序的方法详解
    前言 大家都知道Python的优点是开发效率高,使用方便,C++则是运行效率高,这两者可以相辅相成,不管是在Python项目中嵌入C++代码,或是在C++项目中用Python实现外围功能,都可能遇到Pyth...
    99+
    2022-06-04
    详解 程序 方法
  • Java实现调用外部程序的示例代码
    目录Runtime类与ProcessBuilder类参数传递执行结果Runtime类的使用ProcessBuilder类的使用无参数调用简单参数调用复杂参数调用Apache Comm...
    99+
    2023-05-18
    Java 调用外部程序 java调用程序
  • python程序中调用其他程序的实现
    目录1.os.system函数2.subprocess模块1.os.system函数 wget 是一个下载软件的程序,如果已经下载好该软件,可以用py调用该软件。假如该软件目录在d:...
    99+
    2023-02-01
    python程序调用其他程序 python 调用其他程序
  • golang调用c语言动态库方式实现
    下面我们自己在 Linux 下做一个动态库(.so 文件 - Shared Object),然在用 Go 来使用它。本文所用的操作系统为 Ubuntu18.04, 以 gcc 作为编...
    99+
    2024-04-02
  • java远程调用接口、URL的方式
    一:httpUrlConnection 1.获取HttpURLConnection连接对象 public static HttpURLConnection getHttpURLConne...
    99+
    2023-09-17
    java servlet 开发语言
  • Java调用Python程序方法总结
    如何使用Java调用Python程序 本文为大家介绍如何java调用python方法,供大家参考。 实际工程项目中可能会用到Java和python两种语言结合进行,这样就会涉及到一个问题,就是怎么用Java程序来调用已经写好的py...
    99+
    2023-01-31
    程序 方法 Java
  • C#实现递归调用的Lambda表达式
    前段时间,我写一个树的访问算法的时候,用了Visitor模式把访问的算法分离了出来,当时打算用lambda表达式写visit算法的,却发现带递归调用的lambda表达式没想象的那么好...
    99+
    2024-04-02
  • 在Java中实现远程方法调用(转)
    在Java中实现远程方法调用(转)[@more@]一、Java中的远程方法调用 远程方法调用(Remote Method Invocation, RMI)是Java1.1引入的分布式对象软件包,它的出现简化了在多台机器上的Java应用之间的...
    99+
    2023-06-03
  • JNI实现最简单的JAVA调用C/C++代码
    JNI,是Java Native Interface的简称,中文是“Java本地调用”。通过这种技术可以做到以下两点: Java程序中的函数可以调用Native语言写的函数,Native一般指的是C/C++编写的函数。 Native程序...
    99+
    2023-05-31
    java jni ava
  • C/C++ Crypto密码库调用的实现方法
    目录Sha256加密算法AES 加密与解密AES2 加密:Base64加解密:Hash加密算法RSA加密算法Crypt库实现RSA加密Crypto 库是C/C++的加密算法库,这个加...
    99+
    2024-04-02
  • Android JNI c/c++调用java的实例
    Android JNI c/c++调用java的实例近期通过研究SDL源码 得出Android JNI  c/c++调用Java 无需新建虚拟机,这样省去很多步骤,这样调用Android JNI会变得非常容易,大家看下简单实例:具...
    99+
    2023-05-31
    android jni java
  • Java调用Python程序方法总结(最
    如何使用Java调用Python程序本文为大家介绍如何java调用python方法,供大家参考。 实际工程项目中可能会用到Java和python两种语言结合进行,这样就会涉及到一个问题,就是怎么用Java程序来调用已经写好的pytho...
    99+
    2023-01-31
    程序 方法 Java
  • C/C++实现快速排序算法的两种方式实例
    目录介绍流程如下实现方式一方式二总结介绍 快速排序是对冒泡排序算法的一种改进,快速排序算法通过多次比较和交换来实现排序。 流程如下 (图片来自百度) 实现 以下有两种实现方式,说是...
    99+
    2024-04-02
  • C# 调用WebService的方式汇总
    C# 调用WebService的方式汇总 方式一:根据提供的webservice地址,用VS自带工具生成cs文件,添加到项目中使用即可。方式二:根据webservice地址,动态在项目中生成代...
    99+
    2023-09-07
    c# 服务器
  • c++中函数的调用方式
    c++ 中有两种函数调用方式:值调用和引用调用。值调用传递参数副本,不影响原始变量;引用调用传递参数引用,修改引用会影响原始变量。根据函数目的和效率考虑,选择适当的调用方式:值调用保护原...
    99+
    2024-05-06
    c++
  • C# 调用WebApi的实现
    1.WebRequest方式 Post: private void button1_Click(object sender, EventArgs e) { ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作