JAVA通过JNI调用c++本地方法dll

了解JNI:JAVA因其跨平台特性而受人们喜爱,也正因此,使得它和本机各种内部联系变得很少,所以JNI(Java Native Interface)就是用来解决JAVA本地操作的一种方式。JAVA通过JNI调用本地方法,而本地方法是以库文件的形式存放的(在WINDOWS平台上是DLL文件形式,在UNIX机器上是SO文件形式)。通过调用本地的库文件的内部方法,使JAVA可以实现和本地机器的紧密联系,调用系统级的各接口方法。 

1.编写java程序,编写一个 声明调用c++的实现方法,方法必须用native修饰,并且方法不可以有实现体

public class TestJNI {
	public native void sayHello();
	public static void main(String[] args) {
		System.loadLibrary("hello");  
                new TestJNI().sayHello();
	}
}
2.编译:javac TestJNI.java生成class文件

3.javah TestJNI生成c++头文件:TestJNI.h,代码如下:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class TestJNI */

#ifndef _Included_TestJNI
#define _Included_TestJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     TestJNI
 * Method:    sayHello
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_TestJNI_sayHello
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif
4.生成动态链接库文件hello.dll(我这里用的是vc6.0,也可用vs的cl命令或其他方法)


将刚才生成的TestJNI.h、jdk\include下面的jni.h、jdk\include\win32里的jni_md.h 三个头文件拷贝至工程,再新建一个cpp文件,代码如下:

#include "TestJNI.h"
#include<iostream>
using namespace std;
JNIEXPORT void JNICALL Java_TestJNI_sayHello(JNIEnv * env, jobject obj)//与TestJNI.h中生成的函数同名
{
	cout<<"hello,I am from dll!"<<endl;
}
编译成功之后可以在工程的Debug文件夹下看到一个hello.dll,将其拷贝至TestJNI.class同文件夹

5.运行:java TestJNI




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章