日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java调用动态库(转载)

發布時間:2025/3/20 java 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java调用动态库(转载) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

記得以前 Java 要調用C/C++寫得動態庫都是用的 JNI 方式,還需要自己寫不少 C/C++ 代碼。比如說要在Java中調用已有的動態庫,如 Windows 的 user32.dll 的方法 MessageBoxA,具體步驟是 Java 中聲明一個 native 方法,然后用 javah 命令生成JNI樣式的頭文件,再自己實現頭文件中聲明的方法,在實現方法中裝載動態庫 user32.dll,調用 MessageBoxA 方法,需要把自己寫的這部分 C/C++ 代碼封裝成一個動態庫,如Sample.dll,最后在 java? 中裝載 Sample.dll,然后執行其中所聲明的本地方法。

可見,用老實的JNI方式,我們在調用一個已知動態庫的時候還需要額外生成一個符合JNI規則的動態庫作為橋梁,顯得有點多余了。

下面我將引入一個開源的組件 JNative,在?http://sourceforge.net/projects/jnative?下載(我是通過在sourceforge中輸入java dll搜索到的),通過它調用已有動態庫中的方法就非常的方便,因為中間的JNI處理過程它都為我們做好了。JNative 現在還是?1.4 版,期待正式版的出爐,還不知道這個版本將會有什么Bug出現。

我們下載到的 jnative 的目錄中可以看到三個文件,分別是 JNative.dll,libjnative.so,JNative.jar

JNative.dll? 為 Windows 平臺下用的,可以拷到相應的lib加載路徑,如user.dir、path、system32或windows目錄下
libnative.so 為Linux平臺下用的,可以拷到相應的lib加載路徑,如user.dir、path目錄下
JNative.jar 這個就是我們編程時候要用的

在下載的 jnatidve 的源代碼中有示例代碼,觀看代碼 org/xvolks/test/JNativeTester.java 就知道 jnative 是如何調用動態庫方法的

如代碼行 User32.messageBox(0, "Demonstrates JNative in action with many Win32 calls", "Welcome to JNative", 0);

是調用的關User32的messageBox方法,而messageBox的代碼是

?

  • public?static?final?int?messageBox(int?parentHandle,?String?message, ??
  • ????????String?caption,?int?buttons) ??
  • ????????throws?NativeException,?IllegalAccessException?{ ??
  • ????JNative?n?=?null; ??
  • ????try?{ ??
  • ????????n?=?new?JNative(DLL_NAME,?"MessageBoxA");?//?常量DLL_NAME的值為User32.dll???
  • ????????//?構造JNative時完成裝載User32.dll,并且定位MessageBoxA方法???
  • ????????n.setRetVal(Type.INT);?//?指定返回參數的類型???
  • ????????int?i?=?0; ??
  • ????????n.setParameter(i++,?Type.INT,?""?+?parentHandle); ??
  • ????????n.setParameter(i++,?Type.STRING,?message); ??
  • ????????n.setParameter(i++,?Type.STRING,?caption); ??
  • ????????n.setParameter(i++,?Type.INT,?""?+?buttons);?//?指定位置上的參數類型和值???
  • ????????n.invoke();?//?調用方法???
  • ????????return?Integer.parseInt(n.getRetVal()); ??
  • ????}?finally?{ ??
  • ????????if?(n?!=?null) ??
  • ????????????n.dispose();?//?記得釋放???
  • ????} ??
  • }??
  • ?


    上面的注釋是我加上去的。

    Type有一種叫做Type.PSTRUCT枚舉值,對C/C++中結構的處理都考慮到了,只要用JNative的Pointer類的實例來與結構對應就行了。org/xvolks/test/SNDPTester.java中演示了如何傳遞C/C++中的結構相對應的Java數據類型,也就是怎么封裝成一個JNative的Pointer類型。

    還有在JNative中用了JDK1.5的一些特性,如枚舉、靜態引入等,所以在JDK1.4下是不能用的。

    ?

    轉載:http://blog.csdn.net/hangke/article/details/2697518

    總結

    以上是生活随笔為你收集整理的Java调用动态库(转载)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。