2011年10月15日 星期六

[ Java小學堂 ] JNI 簡介與簡單範例


前言 :
JAVA以其跨平臺的特性深受人們喜愛,而又正由於它的跨平臺的目的,使得它和本地機器的各種內部聯繫變得很少,約束了它的功能。解決JAVA對本地操作的一種方法就是JNI。JAVA通過JNI調用本地方法,而本地方法是以庫文件的形式存放的(在WINDOWS平臺上是DLL文件形式,在UNIX機器上是SO文件形式)。通過調用本地的庫文件的內部方法,使JAVA可以實現和本地機器的緊密聯繫,調用系統級的各介面方法。

以下簡單介紹如何使用JNI:

1. 建立 HelloJni.java
(1) 編寫如下java 代碼
==============HelloJni.java代碼=============
  1. package gays.jni;  
  2.   
  3. public class HelloJni {  
  4.     public native void displayHelloJni();    
  5.     static {  
  6.         System.loadLibrary("JNISimple"); //載進的dll檔名  
  7.     }  
  8.      
  9.     public static void main(String args[]){  
  10.         new HelloJni().displayHelloJni();  
  11.     }  
  12.   
  13. }  


(1)在Compile 以上述代碼後, 請以javah 建立接下來 C要用的header檔
/>javah gays.ini.HelloJni <假設在對應class目錄>
Ps. 若Compile後的class 在 D:/test/gays/ini/ 路徑, 則當前執行路徑應該是 D:/test/.
若成功則會在當前目錄生成 gays_jni_HelloJni.h 頭文件.

2. 跟據前步驟產出header文件建立 dll檔
(1) 編寫如下C代碼, 並引如前步驟產出的頭文件
如果你是使用vc可以follow 如下:
File - > New - > 專案 -> Win 32 主控台應用程序 -> 選擇下一步 -> 選擇 dll
==============HelloJni.java代碼=============
  1. #include  
  2. #include "gays_jni_HelloJni.h"  
  3.   
  4.   
  5. JNIEXPORT void JNICALL Java_gays_jni_HelloJni_displayHelloJni  
  6. (JNIEnv *, jobject){  
  7.     printf("Dynamic dll is calling!\n");  
  8.     printf("Java_gays_jni_HelloJni_displayHelloJni method has been executed!");  
  9.     return;  
  10. }  

(2) 編譯成功後, 請將dll 檔複製到放class檔根目錄 (Here is D:/test/) 並改名為 JNISimple.dll

3. 測試
如果步驟1, 2都完成後, 請使用下面Command進行測試:
D:/test>java gays.jni.HelloJni
Dynamic dll is calling!
Java_gays_jni_HelloJni_displayHelloJni method has been executed!


參考:
http://blog.yam.com/hn12303158/article/19236076

研伸閱讀:
JNI Wiki
The Java Native Interface (JNI) is a programming framework that allows Java code running in a Java Virtual Machine (JVM) to call and to be called[1] by native applications (programs specific to a hardware and operating system platform) and libraries written in other languages, such as C, C++ and assembly.


Sun JNI Document
JavaTM Native Interface (JNI) is a standard programming interface for writing Java native methods and embedding the JavaTM virtual machine* into native applications. The primary goal is binary compatibility of native method libraries across all Java virtual machine implementations on a given platform...


JNI Function API
This chapter serves as the reference section for the JNI functions. It provides a complete listing of all the JNI functions. It also presents the exact layout of the JNI function table...


JNative Blog
Java调用动态库所需要关心的问题:
l 如何装载dll文件,以及如何定位所要使用的方法;
l 数据类型是如何对应的;
l 如何给使用的方法传递参数;
l 如何获取返回的值。...


JNative Blob2
JNative是供java直接调用c++dll的工具包,这样java程序员仅仅知道c++dll中的函数名和参数类型就可以直接调用dll了,省去了使用JNI的繁琐。
下面是一个使用c++dll回调函数的例子...


JNative Blog3
我的環境如下
* Eclipse 3.4.2
* jNative 的lib http://sourceforge.net/projects/jnative/
以下分兩個階段
1. dll 建立
2. java 端讀取 dll ...

JNI 開發筆記 (4) Android NDK 簡介
經歷先前 JNI 基礎系列後,我們將戰場轉移至 Android 平台。
Android 在 Linux 平台基礎之上透過 Dalvik 虛擬機器提供開發者能以 Java 語言開發多數應用程式的環境。
儘管開發者寫的是 Java 但卻無法以原本的心態進行實作,特別是考慮到效能這件...

沒有留言:

張貼留言

[Git 常見問題] error: The following untracked working tree files would be overwritten by merge

  Source From  Here 方案1: // x -----删除忽略文件已经对 git 来说不识别的文件 // d -----删除未被添加到 git 的路径中的文件 // f -----强制运行 #   git clean -d -fx 方案2: 今天在服务器上  gi...