2013-11-28 38 views
0

在許多Java庫類的代碼中,我可以看到本地方法。即使在Object班。原生混合Java代碼如何獨立於平臺?

如果Java在Java代碼轉換爲字節代碼時與平臺無關,那麼本地代碼又如何呢?它是否也轉換爲字節碼?

此本地代碼調用是否轉到操作系統,還是來自下載或安裝Java本身?

+0

_什麼是本地代碼..?它也轉換成字節代碼..?_不,原生代碼是***原生***,所以如果你想創建一個「獨立於系統」的本地庫,你必須關心所有的操作系​​統。這就是JVM的工作方式,包含在JDK中的所有類都由JVM(依賴於系統)本地實現 – BackSlash

+0

這意味着每個本機方法在每個OS中都有自己的實現。所以這個本地調用是直接到OS或JVM支持OS代碼..? –

+0

我在評論中寫道。 JVM是依賴於操作系統的,它本身實現了JDK中包含的所有類 – BackSlash

回答

2

Java庫代碼確實生成本機調用。現在這些調用由JVM完成。如果您注意到,那麼每個系統都有特定於操作系統的JVM,因此所有與系統相關的本機調用最終都由依賴於系統的JVM實現提供服務。

0

native方法的不同口味:

  • 標準Java庫中的本地方法都將在平臺上,你是執行(由Oracle和/或你的Java實現的供應商)正在運行。這樣做是爲該平臺開發Java的過程的一部分。到你使用Java的時候(在該平臺上),移植工作已經完成。 (這些方法實現了JVM及其相關的本機代碼庫/ dll。)

  • 代碼或第三方庫中的本地方法是另一回事。實現這些方法的本地代碼確實代表了可移植性的障礙,因爲它需要(至少)針對每個平臺重新編譯。在很多情況下,移植過程甚至可能會徹底重寫(本機)代碼。


如果Java是獨立於平臺時,Java代碼轉換成字節碼,那麼關於本機代碼?它是否也轉換爲字節碼?

否。本地方法在其他一些編程語言中實現;例如C或C++。

(如果本地方法可以被翻譯成字節碼,就沒有必要讓他們在第一時間被寫爲「原生」!)

這是否本地代碼調用去操作系統還是來自下載或安裝Java本身?

Java本地方法不太可能直接映射到系統調用或調用其中一個標準OS提供的庫。本地方法通常由JVM實現或客戶或第三方本機庫實現。往上看。


1 - 實際上,這有一個例外。在JNode平臺上,標記爲native的Java核心庫中的大多數方法實際上都會映射回Java代碼。但這是因爲,幾乎整個JNode操作系統都是用Java實現的。 JNode的本地代碼編譯器實現了一些「巧妙的技巧」來實現這一點。