Java采用JNI调用VC++生成的dll(Java与C++交互)

什么是JNI?
     JNI全拼是Java Native Interface,中文意思为Java本地调用。JNI标准是Java平台的一部分,它允许java和其他语言的代码进行交互。JNI开始是为了本地已经编译好的语言,尤其是C和C++而设计的,我们也可以使用JNI和其他语言进行沟通,我们只要调用约定受支持了就可以了。

     什么原理?
     我们知道C++中或者C#等.net都能生成.dll类库,而C++(或.net)中生成的.dll文件,相当于我们java程序中java源代码通过编译生成的.class文件,我们在java程序中直接通过code调用C++的dll文件即可。

     在C语言中如果生成一个动态链接库dll文件的时候,需要两部分,一部分是为.h的头文件,这个文件是负责对一些方法的声明,而.cpp文件负责对方法的实现。而在java中,在JDK安装目录的include包中有个jni.h和jni_md.h,这个可以说是java发布的一个接口,在C++中可以直接使用这两个head类型的文件对java要调用的C++方法编译,让java调用,并可以接收java传递过来的参数。直接上代码啦。

     具体的步骤如下所示(java发布一个接口,让C++实现乘法的功能)
 

    1、建立java源代码如下所示。


     建立java project,在src下建立com包,在com包下面建立我们的java类Reliability.java,代码如下所示。

package com;
public class Reliability {
	static {
		try {
			System.loadLibrary("Reliability");      // 系统加载dll文件
		} catch (UnsatisfiedLinkError e) {
			System.out.println("The load problem");
		}
 
	}

	public native int shanfei(int i);           //定义外部接口(其他语言实现)

	public static void main(String[] args) {
		Reliability reliability = new Reliability();
		System.out.print(reliability.shanfei(6));
	}
}

 

2、编译.java源文件

我们想实现传递int 整型参数来实现自己和自己相乘的结果,而实现shanfei(int p)方法的是C++。我们可以通过System.loadLibrary("Reliability")方法实现加载C++生成的dll,通过native声明方法接口以及参数。     

     编写好自己的Reliability.java代码后,可以使用MyEclipse编译为Reliability.class文件或者是直接用javac命令编译为.class文件。

     我的使用的MyEclipse进行编译的,会在/Reliability/bin/com文件夹中生成Reliability.class文件。

 

3、用javah 命令让Reliability.class文件生成C++需要的.h文件,也就是交给C++的接口。

在这里需要注意的是,一定要转到你编译成class文件的上一级目录进行javah命令,并且你的JDK已经配置好环境变量,这里的环境变量为JAVA_HOME:安装jdk bin文件夹的上一级目录,比如我的jdk安装在C:\java\bin....,那我的JAVA_HOME为:C:\java 。path目录:引用JAVA_HOME并且加上\bin ,为 %JAVA_HOME%\bin 。classpath为: .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;这是一定要配置好的。然后在dos窗口如下编写如下命令,生成给C++ .h的文件。

这样在你的class文件上一级目录中就会出现.h 的文件,并且引入到你的MyEclipse中,与com包同级。

 

4、这样java已经给C++发布好了com_Reliability.h的头文件,C++要去实现这个方法了。因为要生成dll文件,所以我们需要建立动态链接库文件,如果用的是C++ 6.0环境,就是建立projects --Dynamic-LInk Library工程。

之后添加我们的com_Reliability.h文件到我们的DLL项目中,目录结构如下所示。

     头文件中的代码如下所示,com_Reliability.h。

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_Reliability */
 
#ifndef _Included_com_Reliability
#define _Included_com_Reliability
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_Reliability
 * Method:    shanfei
 * Signature: (I)I
 */
JNIEXPORT jint JNICALL Java_com_Reliability_shanfei
  (JNIEnv *, jclass, jint);
 
#ifdef __cplusplus
}
#endif
#endif

实现的Reliability.cpp代码如下所示。

#include<jni.h>
#include "com_Reliability.h"
#include<stdio.h>
#include<jni_md.h>
 
JNIEXPORT jint JNICALL Java_com_Reliability_shanfei(JNIEnv *, jclass, jint p)
{
	 int j = p*p;
	 return j;
		
}

切忌:.cpp中和.h中的方法名一定要相同!!!并且把从java中找到的jni.h 和jni_md.h粘贴到外部依赖文件夹,或者直接放到VC98\include文件夹中。


     5、生成dll文件
     这样我们ctrl+F7编译,F7在C++项目的debug中生成Reliability.dll文件,这样我们再把这个dll文件放到java编译的.class目录,同时放到MyEclipse与src同级。这样运行java的Reliability.java文件,就看到C++给我们计算的结果了。显示如下所示。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值