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的代碼是
?
?
上面的注釋是我加上去的。
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调用动态库(转载)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ServiceStack.Redis的问
- 下一篇: 淘宝技术发展(Java时代:脱胎换骨)