Java调用C++程序实现方法

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();
   }
}
  1. 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时自动生成的,并非手动创建的):
    Java调用C++程序实现方法
  2. 编写C++程序 ,打开Visual Studio 2013,执行“文件—>新建—>项目—>Visual C++—>Win32 项目—>确定—>下一步–>选择DLL(D)–>完成”。注意,设置好项目名称以及项目文件所在的位置,如下图标红处所示:
    Java调用C++程序实现方法
    创建好项目之后,将之前生成的HelloWorld_HelloWorld.h头文件添加到项目的“头文件”中,并在源文件中添加helloworld.cpp这一文件,如下图所示:
    Java调用C++程序实现方法
    接下来,在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目录中,如下图所示:
Java调用C++程序实现方法
5. 重新编译HelloWorld.java程序,运行,即可得到Hello World这个结果。
Java调用C++程序实现方法
以上便是Java调用C++程序的实现方法,若有不足之处,请各位大神笔下留情,哈哈哈哈!