亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Java:JNI完全手冊介紹及應用

2019-11-18 11:49:02
字體:
來源:轉載
供稿:網友

  java以其跨平臺的特性深受人們喜愛,而又正由于它的跨平臺的目的,使得它和本地機器的各種內部聯系變得很少,約束了它的功能。解決JAVA對本地操作的一種方法就是JNI。
  JAVA通過JNI調用本地方法,而本地方法是以庫文件的形式存放的(在WINDOWS平臺上是DLL文件形式,在UNIX機器上是SO文件形式)。通過調用本地的庫文件的內部方法,使JAVA可以實現和本地機器的緊密聯系,調用系統級的各接口方法。
  
  簡單介紹及應用如下:
  
  一、JAVA中所需要做的工作
  
  在JAVA程序中,首先需要在類中聲明所調用的庫名稱,如下:
  static {
  System.loadLibrary(“goodlUCk”);
  }
  
  在這里,庫的擴展名字可以不用寫出來,究竟是DLL還是SO,由系統自己判定。
  
  還需對將要調用的方法做本地聲明,要害字為native。且只需要聲明,而不需要具體實現。如下:
  public native static void set(int i);
  public native static int get();
  
  然后編譯該JAVA程序文件,生成CLASS,再用JAVAH命令,JNI就會生成C/C++的頭文件。
  
  例如程序testdll.java,內容為:
  public class testdll
  {
  static
  {
  System.loadLibrary("goodluck");
  }
  public native static int get();
  public native static void set(int i);
  public static void main(String[] args)
  {
  testdll test = new testdll();
  test.set(10);
  System.out.PRintln(test.get());
  }
  }
  
  用javac testdll.java編譯它,會生成testdll.class。
  
  再用javah testdll,則會在當前目錄下生成testdll.h文件,這個文件需要被C/C++程序調用來生成所需的庫文件。
  
  二、C/C++中所需要做的工作
  
  對于已生成的.h頭文件,C/C++所需要做的,就是把它的各個方法具體的實現。然后編譯連接成庫文件即可。再把庫文件拷貝到JAVA程序的路徑下面,就可以用JAVA調用C/C++所實現的功能了。
  接上例子。我們先看一下testdll.h文件的內容:
  /* DO NOT EDIT THIS FILE - it is machine generated */
  #include
  /* Header for class testdll */
  #ifndef _Included_testdll
  #define _Included_testdll
  #ifdef __cplusplus
  extern "C" {
  #endif
  /*
  * Class: testdll
  * Method: get
  * Signature: ()I
  */
  JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass);
  /*
  * Class: testdll
  * Method: set
  * Signature: (I)V
  */
  JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint);
  #ifdef __cplusplus
  }
  #endif
  #endif
  
  在具體實現的時候,我們只關心兩個函數原型
  JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass); 和
  JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint);
  
  這里JNIEXPORT和JNICALL都是JNI的要害字,表示此函數是要被JNI調用的。而jint是以JNI為中介使JAVA的int類型與本地的int溝通的一種類型,我們可以視而不見,就當做int使用。函數的名稱是JAVA_再加上java程序的package路徑再加函數名組成的。參數中,我們也只需要關心在JAVA程序中存在的參數,至于JNIEnv*和jclass我們一般沒有必要去碰它。
  
  好,下面我們用testdll.cpp文件具體實現這兩個函數:
  #include "testdll.h"
  int i = 0;
  JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass)
  {
  return i;
  }
  JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint j)
  {
  i = j;
  }
  
  編譯連接成庫文件,本例是在WINDOWS下做的,生成的是DLL文件。并且名稱要與JAVA中需要調用的一致,這里就是goodluck.dll 。把goodluck.dll拷貝到testdll.class的目錄下,java testdll運行它,就可以觀察到結果了。
  
  我的項目比較復雜,需要調用動態鏈接庫,這樣在JNI傳送參數到C程序時,需要對參數進行處理轉換。才可以被C程序識別。
  
  大體程序如下:
  public class SendSMS {
  static
  {
  System.out.println(System.getProperty("java.library.path"));
  System.loadLibrary("sms");
  }
  public native static int SmsInit();
  public native static int SmsSend(byte[] mobileNo, byte[] smContent);
  }
  
  
  在這里要注重的是,path里一定要包含類庫的路徑,否則在程序運行時會拋出異常:
  java.lang.UnsatisfiedLinkError: no sms in java.library.path
  at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1491)
  at java.lang.Runtime.loadLibrary0(Runtime.java:788)
  at java.lang.System.loadLibrary(System.java:834)
  at com.mobilesoft.sms.mobilesoftinfo.SendSMS.(SendSMS.java:14)
  at com.mobilesoft.sms.mobilesoftinfo.test.main(test.java:18)
  Exception in thread "main"
  
  指引的路徑應該到.dll文件的上一級,假如指到.dll,則會報:
  java.lang.UnsatisfiedLinkError: C:/sms.dll: Can't find dependent libraries
  at java.lang.ClassLoader$NativeLibrary.load(Native Method)
  at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1560)
  at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1485)
  at java.lang.Runtime.loadLibrary0(Runtime.java:788)
  at java.lang.System.loadLibrary(System.java:834)
  at com.mobilesoft.sms.mobilesoftinfo.test.main(test.java:18)
  Exception in thread "main"
  
  通過編譯,生成com_mobilesoft_sms_mobilesoftinfo_SendSMS.h頭文件。(建議使用Jbuilder進行編譯,操作比較簡單!)這個頭文件就是Java和C之間的紐帶。要非凡注重的是方法中傳遞的參數jbyteArray,這在接下來的過程中會重點介紹。
  /* DO NOT EDIT THIS FILE - it is machine generated */
  #include
  /* Header for class com_mobilesoft_sms_mobilesoftinfo_SendSMS */
  #ifndef _Included_com_mobilesoft_sms_mobilesoftinfo_SendSMS
  #define _Included_com_mobilesoft_sms_mobilesoftinfo_SendSMS
  #ifdef __cplusplus
  extern "C" {
  #endif
  /*
  * Class: com_mobilesoft_sms_mobilesoftinfo_SendSMS
  * Method: SmsInit
  * Signature: ()I
  */
  JNIEXPORT jint JNICALL Java_com_mobilesoft_sms_mobilesoftinfo_SendSMS_SmsInit
  (JNIEnv *, jclass);
  /*
  * Class: com_mobilesoft_sms_mobilesoftinfo_SendSMS
  * Method: SmsSend
  * Signature: ([B[B)I
  */
  JNIEXPORT jint JNICALL Java_com_mobilesoft_sms_mobilesoftinfo_SendSMS_SmsSend
  (JNIEnv *, jclass, jbyteArray, jbyteArray);
  #ifdef __cplusplus
  }
  #endif
  #endif
  
  對于我要調用的C程序的動態鏈接庫,C程序也要提供一個頭文件,sms.h。這個文件將要調用的方法羅列了出來。
  /*
  * SMS API
  * Author: yippit
  * Date: 2004.6.8
  */
  #ifndef MCS_SMS_H
  #define MCS_SMS_H
  #define DLLEXPORT __declspec(dllexport)
  /*sms storage*/
  #define SMS_SIM 0
  #define SMS_MT 1
  /*sms states*/
  #define SMS_UNREAD 0
  #define SMS_READ 1
  /*sms type*/
  #define SMS_NOPARSE -1
  #define SMS_NORMAL 0
  #define SMS_Flash 1
  #define SMS_MMSNOTI 2
  typedef struct tagSmsEntry {
  int index; /*index, start from 1*/
  int status; /*read, unread*/
  int type; /*-1-can't parser 0-normal, 1-flash, 2-mms*/
  int storage; /*SMS_SIM, SMS_MT*/
  char date[24];
  char number[32];
  char text[144];
  } SmsEntry;
  DLLEXPORT int SmsInit(void);
  DLLEXPORT int SmsSend(char *phonenum, char *content);
  DLLEXPORT int SmsSetSCA(char *sca);
  DLLEXPORT int SmsGetSCA(char *sca);
  DLLEXPORT int SmsSetInd(int ind);
  DLLEXPORT int SmsGetInd(void);
  DLLEXPORT int SmsGetInfo(int storage, int *max, int *used);
  DLLEXPORT int SmsSaveFlash(int flag);
  DLLEXPORT int SmsRead(SmsEntry *entry, int storage, int index);
  DLLEXPORT int SmsDelete(int storage, int index);
  DLLEXPORT int SmsModifyStatus(int storage, int index); /*unread -> read*/
  #endif
  
  在有了這兩個頭文件之后,就可以進行C程序的編寫了。也就是實現對JNI調用的兩個方法。在網上的資料中,由于調用的方法實現的都比較簡單,(大多是打印字符串等)所以避開了JNI中最麻煩的部分,也是最要害的部分,參數的傳遞。由于Java和C的編碼是不同的,所以傳遞的參數是要進行再處理,否則C程序是會對參數在編譯過程中提出警告,

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲免费伊人电影在线观看av| 国产精品福利片| 日韩毛片在线看| 亚洲白虎美女被爆操| 国产最新精品视频| 日韩经典第一页| 亚洲午夜色婷婷在线| 国内外成人免费激情在线视频网站| 国产一区二区三区免费视频| 亚洲aⅴ男人的天堂在线观看| 日韩av123| 综合136福利视频在线| 国产视频综合在线| 97国产精品人人爽人人做| 91久久精品国产91久久性色| 色综合久久久久久中文网| 欧美视频中文在线看| 国产在线视频2019最新视频| 懂色av影视一区二区三区| 国产精品日韩在线播放| 亚洲xxxx在线| 欧美日韩国产精品一区二区三区四区| 日本亚洲欧美成人| 欧美一级淫片播放口| 北条麻妃一区二区三区中文字幕| 中文字幕国产亚洲| 日韩激情视频在线播放| 久久久国产一区| 亚洲一区二区三区四区在线播放| 成人黄色片在线| 日本午夜在线亚洲.国产| 国产一区二区三区在线| 另类专区欧美制服同性| 亚洲国产精品va在看黑人| 中文字幕精品在线视频| 91在线|亚洲| 国产亚洲欧美另类中文| 91系列在线播放| 91在线高清免费观看| 这里只有精品视频在线| 久久久久久伊人| 欧美激情一级二级| 亚洲精品丝袜日韩| 久久成人精品一区二区三区| 日韩av在线看| 色综久久综合桃花网| 欧美猛交免费看| 亚洲电影免费观看高清完整版在线观看| 91av在线免费观看视频| 欧美在线性爱视频| 精品亚洲精品福利线在观看| 色噜噜狠狠狠综合曰曰曰88av| 91丨九色丨国产在线| 亚洲国产99精品国自产| 欧美一级大胆视频| 欧美一性一乱一交一视频| 国产精品国产亚洲伊人久久| 精品国产91久久久久久老师| 91国语精品自产拍在线观看性色| 亚洲国产精品人久久电影| 久久久av亚洲男天堂| 久久久久久亚洲精品不卡| 日韩中文av在线| 日韩精品视频在线| www.久久色.com| 国产午夜精品视频免费不卡69堂| 久久影院中文字幕| 亚洲国产成人在线视频| 国产亚洲视频在线观看| 亚洲第一级黄色片| 日韩在线中文视频| 国语自产精品视频在线看抢先版图片| 亚洲精品aⅴ中文字幕乱码| 精品亚洲永久免费精品| 成人在线视频网| 高清日韩电视剧大全免费播放在线观看| 欧美日本在线视频中文字字幕| 日本伊人精品一区二区三区介绍| 日韩视频免费在线观看| 国产欧美日韩免费| 国产欧美欧洲在线观看| 日韩欧美国产激情| 日本精品视频在线观看| 亚洲国产日韩一区| 在线观看视频亚洲| 久久综合九色九九| 日韩精品极品在线观看播放免费视频| 国产综合久久久久| 国产亚洲成精品久久| 92裸体在线视频网站| 欧美另类高清videos| 992tv在线成人免费观看| 亚洲专区国产精品| 日韩精品视频观看| 日韩欧中文字幕| 成人久久久久久久| 久久综合久中文字幕青草| 亚洲精品国产精品乱码不99按摩| 91经典在线视频| 亚洲一区二区三区视频| 久久久精品国产亚洲| 国产亚洲精品久久久久久777| 日韩在线观看免费高清完整版| 国产精品麻豆va在线播放| 日韩视频免费看| 久久99久久99精品免观看粉嫩| 国产精品久久久久91| 欧美日韩在线免费观看| 日韩在线观看精品| 亚洲最大的成人网| 欧美在线视频免费观看| 久久久成人av| 久久夜色精品国产欧美乱| 久久久久久久一区二区| 亚洲色图校园春色| 亚洲欧美激情精品一区二区| 亚洲男人av电影| 国产丝袜高跟一区| 欧美在线视频免费| 国产日韩欧美视频| 国内精品美女av在线播放| 欧美裸身视频免费观看| 久久视频在线观看免费| 亚洲欧美国产另类| 国产成人福利夜色影视| 国产精品一区二区三区久久久| 97久久精品国产| 另类少妇人与禽zozz0性伦| 亚洲精品720p| 日韩成人av在线播放| 国产精品美女久久久久久免费| 日韩中文字幕在线观看| 国产91精品不卡视频| 欧美疯狂做受xxxx高潮| 亚洲自拍偷拍区| 亚洲欧美日韩中文在线制服| 亚洲伊人成综合成人网| 精品久久中文字幕| 亚洲美女在线看| 操人视频在线观看欧美| 91社影院在线观看| 亚洲情综合五月天| 日本aⅴ大伊香蕉精品视频| 欧美日韩亚洲系列| 国产福利视频一区二区| 欧美男插女视频| 日韩精品有码在线观看| xvideos成人免费中文版| 国产成人精品综合| 亚洲毛片在线免费观看| 亚洲天堂av女优| 中文字幕久久精品| 日韩成人在线网站| 欧美在线免费看| 亚洲a级在线播放观看| 日本久久久久久久| 美女撒尿一区二区三区| 亚洲最新av在线| 午夜精品久久久99热福利| 97视频国产在线| 欧美日韩一区二区免费视频| 国产精品久久电影观看| 91精品久久久久久久久青青| 欧美亚洲国产视频小说|