熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

利用JNative實現Java調用dll動態庫

2022-06-13   來源: Java核心技術 

  由於項目要求需要用Java調用windows的dll文件查了一下如果用JNI的話是比較麻煩的在上搜索了一下Java dll首先出現的是Jnative於是決定用它後來也試了些別的但還是JNative好使簡單總結如下

  Java調用動態庫所需要關心的問題

  l         如何裝載dll文件以及如何定位所要使用的方法

  l         數據類型是如何對應的

  l         如何給使用的方法傳遞參數

  l         如何獲取返回的值

  JNative INFO

  Resource URL:

  Source Code:

  Detailed Review:

  JavaDOC

  Version

  一個開源的組件通過它調用已有動態庫中的方法就非常的方便支持CallBack

  為什麼選擇JNative

  同類的開源組件相對活躍的還有JNA ( Java Native Access ) JawinNativecalletc但是Jnative 相對更容易使用它對數據類型的處理做的更好

  l         JNA 需要用戶對所使用的DLL文件事先進行封裝才能裝載另外需要在一個java接口中描述目標DLL中的函數與結構從而使JNA自動實現Java接口到native function的映射較麻煩

  l         Nativecall 暫時還不知道如何裝載dll文件

  l         Jawin 數據類型匹配相當敏感它采用一種叫做instruction string的格式來傳遞參數還沒有完全理解

  How to

  解壓JNativezip 獲得三個文件分別是JNativeCppdlllibJNativeCppsoJNativejar

  JNativeCppdll Windows下用的拷到windows / system目錄下

  libJNativeCppso Linux下的咚咚

  JNativejar 這是一個擴展包將其copy到C:\jdk\jre\lib\ext 下(我的目錄結構)系統會自動加載

  結構映射(Structure Mapping)

  Type

  Length

  JNative class

  DWORD

  

  orgxvolksjnativemiscbasicStructuresLONG

  HWND

  

  orgxvolksjnativemiscbasicStructuresHWND

  COLORREF

  

  orgxvolksjnativemiscbasicStructuresLONG

  COLORREF*

  

  orgxvolksjnativepointersPointer

  LPARAM

  

  orgxvolksjnativemiscbasicStructuresLPARAM

  LPCCHOOKPROC

  

  orgxvolksjnativeutilCallback

  LPCTSTR

  

  orgxvolksjnativepointersPointer

  一些關鍵的類及方法

  Class

  作用

  一般用到的方法(參數略參考Doc)

  orgxvolksjnativeJnative

  裝載dll文件定位函數

  JNative()setParameter()setRetVal()getRetVal() etc

  orgxvolksjnativepointersPointer

  替代本地函數中的的指針需要先申請一塊內存空間才能創建

  Pointer()dispose()

  orgxvolksmoryMemoryBlockFactory

  申請一塊內存空間

  createMemoryBlock()

  orgxvolksjnativeexceptionsNativeException

  拋出裝載定位等方面的異常

  orgxvolksjnativeType

  列舉和管理Jnative需要的不同的數據類型

  (二)

  簡單測試Javadoc 下和官方網上有些例子下面的是我隨便從IC讀卡程序中找了個DLL進行的測試

  SCReaderdll 下的SCHelp_HexStringToBytes()函數原型

  SCREADER_API WINAPI long SCHelp_HexStringToBytes(

  LPCTSTR pSrc

  BYTE* pTar

  int MaxCount

  );

  注意dll文件需要放到System否則可能找不到

  通過Jnative 用java 來調用代碼如下

  package onlyfundllcall;

  import orgxvolksjnativeJNative;

  import orgxvolksjnativeexceptionsNativeException;

  import orgxvolksjnativepointersPointer;

  import orgxvolksmoryMemoryBlockFactory;

  import orgxvolksjnativeType;

  public class UserCall {

  /**

  * return 轉換成功的字節數

  */

  static JNative Something = null;

  static Pointer pointer;

  public String getSomething(String pSrc Pointer pTar int MaxCount) throws NativeException IllegalAccessException{

  try{

  if(Something == null){

  pTar = new Pointer(MemoryBlockFactorycreateMemoryBlock());

  Something = new JNative(SCReaderDLL SCHelp_HexStringToBytes);

  // 利用orgxvolksjnativeJNative 來裝載 SCReaderdll並利用其SCHelp_HexStringToBytes方法

  SomethingsetRetVal(TypeINT);

  // 指定返回參數的類型

  }

  int i=;

  SomethingsetParameter(i++pSrc);

  SomethingsetParameter(i++pTar);

  SomethingsetParameter(i++MaxCount);

  Systemoutprintln(調用的DLL文件名為+SomethinggetDLLName());

  Systemoutprintln(調用的方法名為+SomethinggetFunctionName());

  //傳值

  Somethinginvoke();//調用方法

  return SomethinggetRetVal();

  }finally{

  if(Something!=null){

  Somethingdispose();//釋放

  }

  }

  }

  public Pointer creatPointer() throws NativeException{

  pointer = new Pointer(MemoryBlockFactorycreateMemoryBlock());

  pointersetIntAt( );

  return pointer;

  }

  public static void main(String[] args) throws NativeException IllegalAccessException {

  UserCall uc = new UserCall();

  String result = ucgetSomething(FFFFF uccreatPointer() );

  Systemerrprintln(轉換成功的字節數為+result);

  TestCallbackrunIt();

  }

  }


From:http://tw.wingwit.com/Article/program/Java/hx/201311/26786.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.