歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Java native interface(JNI)技術簡單應用

手上一個項目需要通過usb口去讀取usbkey的信息,廠家提供的只有C/C++的接口,而主應用是java的,所以需要使用java去調用動態鏈接庫,所以花了點時間研究了下JNI技術,jdk對JNI技術封裝得很到位,使用起來非常簡單,JNI技術最關鍵還是在於jni數據類型和本地數據類型的轉換。先簡單羅列下JNI的創建過程:

首先需要寫一個java類,然後定義需要使用C/C++去實現的方法(雖然說jni是java native interface,但是目前只支持c/c++實現),使用native關鍵字聲明。這裡寫一個簡單的例子:

TestJNI.java

[java:nogutter]

  1. package test.jni;  
  2.   
  3. public class TestJNI  
  4. {  
  5.       
  6.     static  
  7.     {  
  8.          System.loadLibrary("TestJNI");  
  9.          //這個是之後產生的庫的名字,不需要加後綴,   
  10.              //自動根據系統找.dll或者.so;   
  11.     }  
  12.   
  13.     public native String helloWorld();  
  14.       
  15.     public static void main(String[] args)  
  16.     {  
  17.         TestJNI t = new TestJNI();  
  18.         System.out.println(t.helloWorld());  
  19.     }  
  20. }  

然後將以上文件使用javac編譯,然後使用javah命令,如下:

javac test/jni/TestJNI.java

javah test.jni.TestJNI

之後會得到一個test_jni_TestJNI.h的頭文件,內容如下:

test_jni_TestJNI.h

[cpp]

  1. /* DO NOT EDIT THIS FILE - it is machine generated */  
  2. #include <jni.h>   
  3. /* Header for class test_jni_TestJNI */  
  4.   
  5. #ifndef _Included_test_jni_TestJNI   
  6. #define _Included_test_jni_TestJNI   
  7. #ifdef __cplusplus   
  8. extern "C" {  
  9. #endif   
  10. /* 
  11.  * Class:     test_jni_TestJNI 
  12.  * Method:    helloWorld 
  13.  * Signature: ()Ljava/lang/String; 
  14.  */  
  15. JNIEXPORT jstring JNICALL Java_test_jni_TestJNI_helloWorld  
  16.   (JNIEnv *, jobject);  
  17.   
  18. #ifdef __cplusplus   
  19. }  
  20. #endif   
  21. #endif  

然後編寫c/c++實現,如下:

TestJNI.c

[cpp]

  1. #include <stdio.h>   
  2. #include <jni.h>   
  3. #include <windows.h>   
  4.   
  5. #include "test_jni_TestJNI.h"   
  6.   
  7. JNIEXPORT jstring JNICALL Java_test_jni_TestJNI_helloWorld  
  8.   (JNIEnv * env, jobject object){  
  9.     //在c中必須給形式參數聲明變量名,C++中可以不用,頭文件中不需要修改;   
  10.     const char* str = "helloWorld";  
  11.     return (*env)->NewStringUTF(env,str);  
  12.     //C++中可以直接env->NewStringUTF(str),這個函數編碼中文會亂碼;   
  13.       
  14. }  

使用VC編譯成TestJNI.dll,編譯是需要引入jre/include文件夾和jre/include/win32文件夾。

將TestJNI.dll拷貝至剛才test.jni.TestJNI的classpath下面,然後運行java test.jni.TestJNI就能得到輸出了,一些在編寫C程序時遇到的問題都在c代碼中注釋了,希望能給遇到同樣問題的朋友一個借鑒。

Copyright © Linux教程網 All Rights Reserved