歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Java native interface(JNI)技術簡單應用

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

日期:2017/3/1 10:35:04   编辑:Linux編程
手上一個項目需要通過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. public class TestJNI
  3. {
  4. static
  5. {
  6. System.loadLibrary("TestJNI");
  7. //這個是之後產生的庫的名字,不需要加後綴,
  8. //自動根據系統找.dll或者.so;
  9. }
  10. public native String helloWorld();
  11. public static void main(String[] args)
  12. {
  13. TestJNI t = new TestJNI();
  14. System.out.println(t.helloWorld());
  15. }
  16. }

然後將以上文件使用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. #ifndef _Included_test_jni_TestJNI
  5. #define _Included_test_jni_TestJNI
  6. #ifdef __cplusplus
  7. extern "C" {
  8. #endif
  9. /*
  10. * Class: test_jni_TestJNI
  11. * Method: helloWorld
  12. * Signature: ()Ljava/lang/String;
  13. */
  14. JNIEXPORT jstring JNICALL Java_test_jni_TestJNI_helloWorld
  15. (JNIEnv *, jobject);
  16. #ifdef __cplusplus
  17. }
  18. #endif
  19. #endif

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

TestJNI.c

[cpp]

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

使用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