爲了能夠在項目中同時的堅固java和c++的特性,例如底層的硬件由c++操作,上層的應用由java去實現,那麼這時就要用到JNI技術。當然,不只是這種單方面的java調用c++可以使用JNI,JNI是提供雙向交互的接口,我們可以將java vm嵌入到應用程序中,例如瀏覽器中運行applet,當瀏覽器遇到applet標籤時,瀏覽器會將標籤內的內容交給java vm解釋。
JNI編程----JAVA調用C++動態庫
首先我們要將調用dll接口的JAVA類寫出來:
JAVA代碼如下:
public class HelloJni
{
public native void displayHelloJni();
static
{
System.loadLibrary("helloJni");
}
public static void main(String[] args)
{
new HelloJni().displayHelloJni();
}
}
文件名HelloJni.java,java中類的名字必須和文件名相同。
有了這個java的源碼,我們就可以通過javac的指令生成HelloJni.class,再用javah生成頭文件,這個頭文件是我們在生成動態庫時需要的。
頭文件是這樣的:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloJni */
#ifndef _Included_HelloJni
#define _Included_HelloJni
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloJni
* Method: displayHelloJni
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloJni_displayHelloJni
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
我們要根據生成的頭文件來寫dll,例如上面的這個頭文件,我們在dll中就要定義Java_HelloJni_displayHelloJni(JNIEnv*,jobject)這樣的接口。
下面是動態庫的源代碼:
#include <jni.h>
#include "HelloJni.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_HelloJni_displayHelloJni(JNIEnv *env, jobject obj)
{
printf("Hello Dynamic Link Library has been calling!\n");
printf("Java_HelloJni_displayHelloJni method has been executed!\n");
return;
}
添加完上述代碼,我們編譯鏈接,發現根本通過不了,這時我們要將之前生成的HelloJni.h頭文件放到源代碼的目錄下,並且要在工程中包含jni.h,這個頭文件是在jdk的include中。包含了這些我們的工程就完成了。可以在command中輸入java HelloJni命令進行測試。
這是一個簡單的JNI編程,其他的複雜的也都是這樣的方式完成的。