JNI=java native interface, 爲java應用程序提供調用本地方法的接口
The standard Java class library may not support the platform-dependent features needed by your application.
You may already have a library or application written in another programming language and you wish to make it accessible to Java applications.
You may want to implement a small portion of time-critical code in a lower-level programming language, such as assembly, and then have your Java application call these functions
步驟:
1.編寫帶有native聲明的方法的java類
public class HelloWorld {
static{
System.loadLibrary("hellodll");
}
public native void dispHelloWorld();
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//System.out.println("abc");
new HelloWorld().dispHelloWorld();
}
}
2,保存後如果沒有錯誤eclipse會編譯產生jni/HelloWorld.class
3,假設工程產生的class都在 classes文件夾下(這個文件夾名字跟個人eclipse設置有關,也可能就是工程根目錄),那麼控制檯cd到classes用javah命令產生h 文件,XXX/classes>javah -jni jni.HelloWorld(package不要漏掉),產生的jni_HelloWorld.h文件如下
#include <jni.h>
/* Header for class jni_HelloWorld */
#ifndef _Included_jni_HelloWorld
#define _Included_jni_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: jni_HelloWorld
* Method: dispHelloWorld
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_jni_HelloWorld_dispHelloWorld
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
4,寫cpp,實現jni_HelloWorld.h中的函數,這裏請注意函數名,cpp裏的函數名跟h文件的函數名要一致,如果是從網上 copy的一些例子,函數名跟你例子的名字不一致雖然之後可以正確編譯併產生dll,但是最終運行java程序鏈接的時候會出錯,拋出 java.lang.UnsatisfiedLinkError異常,本人就在此浪費了很長時間。
jni_HelloWorldImp.cpp內容如下:
#include "jni_HelloWorld.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_jni_HelloWorld_dispHelloWorld
(JNIEnv *env, jobject obj)
{
printf("Hello world ! ");
return;
}
5,編譯cpp產生dll,在控制檯下>cl -I%java_home%\include -I%java_home%\include\win32 -LD jni_HelloWorldImp.cpp -Fehellodll.dll
以上命令的參數中,-I表示編譯包含的額外目錄,-LD表示產生dll,-Fe後面表示產生dll的名字,具體的參數可以自己用cl -help命令查看,cl環境配置可以參考
用vs編譯器cl在控制檯下編譯一文
如果成功編譯,會產生hellodll.dll,hellodll.lib,hellodll.exp三個文件,將hellodll.dll考到工程根目錄下。
6,運行java程序,輸出Hello world !