自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Java通過JNI調(diào)用C語言的方法

開發(fā) 后端
Java以其跨平臺的特性深受人們喜愛,而又正由于它的跨平臺的目的,使得它和本地機(jī)器的各種內(nèi)部聯(lián)系變得很少,約束了它的功能。解決JAVA對本地操作的一種方法就是JNI。

Java通過JNI調(diào)用本地方法,而本地方法是以庫文件的形式存放的(在WINDOWS平臺上是DLL文件形式,在UNIX機(jī)器上是SO文件形式)。通過調(diào)用本地的庫文件的內(nèi)部方法,使Java可以實(shí)現(xiàn)和本地機(jī)器的緊密聯(lián)系,調(diào)用系統(tǒng)級的各接口方法。

簡單介紹及應(yīng)用如下:

一、Java中所需要做的工作

在Java程序中,首先需要在類中聲明所調(diào)用的庫名稱,如下:

Java代碼

  1. static {        
  2. System.loadLibrary(“goodluck”);        
  3. }    
  4. static {   
  5. System.loadLibrary(“goodluck”);   

在這里,庫的擴(kuò)展名字可以不用寫出來,究竟是DLL還是SO,由系統(tǒng)自己判斷。

還需要對將要調(diào)用的方法做本地聲明,關(guān)鍵字為native。并且只需要聲明,而不需要具體實(shí)現(xiàn)。如下:

Java代碼

  1. public native static void set(int i);      
  2. public native static int get();     
  3. public native static void set(int i);   
  4. public native static int get();  

然后編譯該Java程序文件,生成CLASS,再用JavaH命令,JNI就會生成C/C++的頭文件。

例如程序testdll.Java,內(nèi)容為:

Java代碼

  1. public class testdll      
  2. {      
  3. static      
  4. {      
  5. System.loadLibrary("goodluck");      
  6. }      
  7. public native static int get();      
  8. public native static void set(int i);      
  9. public static void main(String[] args)      
  10. {      
  11. testdll test = new testdll();        
  12. test.set(10);       
  13. System.out.println(test.get());      
  14. }        
  15. }    
  16. public class testdll   
  17. {   
  18. static   
  19. {   
  20. System.loadLibrary("goodluck");   
  21. }   
  22. public native static int get();   
  23. public native static void set(int i);   
  24. public static void main(String[] args)   
  25. {   
  26. testdll test = new testdll();   
  27. test.set(10);   
  28. System.out.println(test.get());   
  29. }   

用Javac testdll.Java編譯它,會生成testdll.class。

再用Javah testdll,則會在當(dāng)前目錄下生成testdll.h文件,這個(gè)文件需要被C/C++程序調(diào)用來生成所需的庫文件。

二、C/C++中所需要做的工作

對于已生成的.h頭文件,C/C++所需要做的,就是把它的各個(gè)方法具體的實(shí)現(xiàn)。然后編譯連接成庫文件即可。再把庫文件拷貝到Java程序的路徑下面,就可以用Java調(diào)用C/C++所實(shí)現(xiàn)的功能了。

接上例子。我們先看一下testdll.h文件的內(nèi)容:

Java代碼

  1. /* DO NOT EDIT THIS FILE - it is machine generated */      
  2. #include      
  3.     
  4. /* Header for class testdll */      
  5.     
  6. #ifndef _Included_testdll      
  7.     
  8. #define _Included_testdll      
  9.     
  10. #ifdef __cplusplus      
  11.     
  12. extern "C" {      
  13.     
  14. #endif      
  15.     
  16. /*     
  17.    
  18. * Class: testdll     
  19.    
  20. * Method: get     
  21.    
  22. * Signature: ()I     
  23.    
  24. */      
  25.     
  26. JNIEXPORT jint JNICALL Java_testdll_get      
  27.     
  28. (JNIEnv *, jclass);      
  29.     
  30. /*     
  31.    
  32. * Class: testdll     
  33.    
  34. * Method: set     
  35.    
  36. * Signature: (I)V     
  37.    
  38. */      
  39.     
  40. JNIEXPORT void JNICALL Java_testdll_set      
  41.     
  42. (JNIEnv *, jclass, jint);      
  43.     
  44. #ifdef __cplusplus      
  45.     
  46. }      
  47.     
  48. #endif      
  49.     
  50. #endif    
  51.  
  52. /* DO NOT EDIT THIS FILE - it is machine generated */   
  53. #include   
  54.  
  55. /* Header for class testdll */   
  56.  
  57. #ifndef _Included_testdll   
  58.  
  59. #define _Included_testdll   
  60.  
  61. #ifdef __cplusplus   
  62.  
  63. extern "C" {   
  64.  
  65. #endif   
  66.  
  67. /*   
  68.  
  69. * Class: testdll   
  70.  
  71. * Method: get   
  72.  
  73. * Signature: ()I   
  74.  
  75. */   
  76.  
  77. JNIEXPORT jint JNICALL Java_testdll_get   
  78.  
  79. (JNIEnv *, jclass);   
  80.  
  81. /*   
  82.  
  83. * Class: testdll   
  84.  
  85. * Method: set   
  86.  
  87. * Signature: (I)V   
  88.  
  89. */   
  90.  
  91. JNIEXPORT void JNICALL Java_testdll_set   
  92.  
  93. (JNIEnv *, jclass, jint);   
  94.  
  95. #ifdef __cplusplus   
  96.  
  97. }   
  98.  
  99. #endif   
  100.  
  101. #endif 

在具體實(shí)現(xiàn)的時(shí)候,我們只關(guān)心兩個(gè)函數(shù)原型 :

Java代碼

JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass);  

JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass);

和Java代碼

JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint);  

JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint);

這里JNIEXPORT和JNICALL都是JNI的關(guān)鍵字,表示此函數(shù)是要被JNI調(diào)用的。而jint是以JNI為中介使Java的int類型與本地的int溝通的一種類型,我們可以視而不見,就當(dāng)做int使用。函數(shù)的名稱是Java_再加上Java程序的package路徑再加函數(shù)名組成的。參數(shù)中,我們也只需要關(guān)心在Java程序中存在的參數(shù),至于JNIEnv*和jclass我們一般沒有必要去碰它。

好,下面我們用testdll.cpp文件具體實(shí)現(xiàn)這兩個(gè)函數(shù):

Java代碼

  1. #include "testdll.h"       
  2. int i = 0;       
  3. JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass)       
  4. {       
  5. return i;       
  6. }       
  7. JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint j)        
  8. {        
  9. i = j;        
  10. }    
  11. #include "testdll.h"   
  12. int i = 0;   
  13. JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass)   
  14. {   
  15. return i;   
  16. }   
  17. JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint j)   
  18. {   
  19. i = j;   

編譯連接成庫文件,本例是在WINDOWS下做的,生成的是DLL文件。并且名稱要與Java中需要調(diào)用的一致,這里就是goodluck.dll

把goodluck.dll拷貝到testdll.class的目錄下,Java testdll運(yùn)行它,就可以觀察到結(jié)果了。

【編輯推薦】

  1. Java連接MySQL中文亂碼處理
  2. 在Java應(yīng)用程序中使用Jfreechart配置
  3. Java虛擬機(jī)內(nèi)部構(gòu)成淺析
  4. 淺談Java線程的生命周期
  5. 關(guān)于Java繼承的一些復(fù)習(xí)
責(zé)任編輯:彭凡 來源: javaeye
相關(guān)推薦

2012-04-28 15:28:21

JNI混合編程Java

2010-06-17 11:51:20

java.net DLLC#

2009-12-08 17:15:43

PHP調(diào)用Java語言

2012-03-20 11:37:24

JavaJNI

2009-08-03 12:57:27

C#調(diào)用DLL

2014-05-15 16:33:05

C++CLI調(diào)用C#

2009-08-31 18:05:14

C#調(diào)用WalkTre

2009-08-31 16:33:28

C#調(diào)用Dispose

2009-08-11 11:07:49

Java調(diào)用C# we

2010-06-23 13:11:36

JavaJNI

2009-07-31 17:28:35

C#語言調(diào)用DLL

2011-04-08 09:52:44

C++C#DLL

2014-09-02 10:43:45

RedisRPC

2010-02-05 15:59:26

C++函數(shù)重載

2011-06-08 09:19:26

Android JNI

2009-09-01 11:04:59

C#調(diào)用擴(kuò)展方法

2024-05-16 12:33:37

C#編程指針

2011-12-28 10:08:24

Javajni

2011-07-20 10:30:29

C語言

2010-01-22 14:46:25

C++語言
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號