下面的文章由轉載而來,java與c++的調用基本思路是這樣子,可是結合個人使用經驗,在使用jna和jnative的時候須要考慮到jdk的版本,jnative跟jdk1.4的結合可能會有點問題,由於我以前選的是jnative,而咱們的jdk版本是1.4,咱們下載的jnative jar不支持1.4版本,這樣才換了jna,慶幸jna支持jdk1.4,特做此說明。 java
-------------------------------------------------------------------------------------------------- c++
簡單的來講,這篇文章就是介紹一個十分好用的Java Native開發工具, JNA。 在Java編程中,大部分時間都不須要理會JNI,可是當你須要調用一個本地的C/C++庫的時候,你就不得不考慮若是在Java中調用C庫中的接口(dll, so)。這樣的狀況有不少,好比當你須要訪問一個硬件時,而硬件廠商只提供C語言寫的驅動和庫文件。 剛開始,或許像我同樣,大部分人知道Java有一個叫JNI的東西能夠作到這一點,還不壞不是麼,至少能夠實現它。可是JNI的編寫至關複雜和拙劣,關鍵的一點是須要編寫C代碼,要知道這對於至關一部分Java程序員來講可不是一個容易的事情。除了你要精通C語言,還要熟悉JNI的知識,包括C的數據類型如何對應到JNI的C數據類型,又如何對應到Java的數據類型,還有不少其餘的細節須要注意,好比垃圾回收的問題,還有結構體數據類型對應問題,跨平臺問題等等都足以把你搞得頭大。不少狀況下,只不過是爲了調用一個第三方庫,不得再也不造出本身的一個庫,不得不編寫JNI代碼和本地代碼。我爲何不能直接調用本地庫代碼? 直到有那麼一天,某我的告訴你有個叫JNA的東西,就是專門用來解決這個問題的。像下面這個例子這麼簡單。 git
package com.sun.jna.examples; import com.sun.jna.Library; import com.sun.jna.Native; import com.sun.jna.Platform; /** Simple example of JNA interface mapping and usage. */ public class HelloWorld { // This is the standard, stable way of mapping, which supports extensive // customization and mapping of Java to native types. public interface CLibrary extends Library { CLibrary INSTANCE = (CLibrary) Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"), CLibrary.class); void printf(String format, Object... args); } public static void main(String[] args) { CLibrary.INSTANCE.printf("Hello, World\n"); for (int i=0;i < args.length;i++) { CLibrary.INSTANCE.printf("Argument %d: %s\n", i, args[i]); } } }使用JNA,你甚至不須要不少的文檔,只要拿到第三方庫的頭文件,好比third.h,根據裏面的函數定義直接生成Java的代碼,幾分鐘就能夠搞定。Java和本地C庫的映射,能夠根據頭文件直接生成,甚至不用開發人員手動編寫對應關係。要用哪幾個函數,就在Java接口中添加哪幾個函數。你能夠按照本身想要的方式加載本地庫(若是你曾被JNI下面System.loadLibrary那捉摸不定的java.library.path搞得生不如死),JNA還能夠作到C結構體和Java類的映射,若是你須要在Java中,向本地方法傳遞結構體,這就會頗有用:
public static class SYSTEMTIME extends Structure { public short wYear; public short wMonth; public short wDayOfWeek; public short wDay; public short wHour; public short wMinute; public short wSecond; public short wMilliseconds; } void GetSystemTime(SYSTEMTIME result);
相比較與JNI來講,JNA也有它的缺點,其實JNA是創建與JNI的基礎之上的,因此若是對性能要求特別高,那麼多花點時間在JNI上面也許是值得的。另外,JNA在Java調用底層C庫的時候特別方便,可是反過來,若是想要從C裏面調用Java,JNA可能會遇到不小的麻煩,這時候你也許須要轉回到JNI. 若是你還對Java的Native開發心有餘悸,但願這篇介紹的JNA的文章能夠幫助你跨越JNI開發的這道鴻溝:) 程序員