了解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