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