JNI編程

爲了能夠在項目中同時的堅固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編程,其他的複雜的也都是這樣的方式完成的。




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