国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

使用 Java Native Interface 的最佳實踐

2019-11-17 04:03:51
字體:
來源:轉載
供稿:網友
java™ 本機接口(Java Native Interface,JNI)是一個標準的 Java API,它支持將 Java 代碼與使用其他編程語言編寫的代碼相集成。如果您希望利用已有的代碼資源,那么可以使用 JNI 作為您工具包中的關鍵組件 —— 比如在面向服務架構(SOA)和基于云的系統中。但是,如果在使用時未注意某些事項,則 JNI 會迅速導致應用程序性能低下且不穩定。本文將確定 10 大 JNI 編程缺陷,提供避免這些缺陷的最佳實踐,并介紹可用于實現這些實踐的工具。

Java 環境和語言對于應用程序開發來說是非常安全和高效的。但是,一些應用程序卻需要執行純 Java 程序無法完成的一些任務,比如:
    *  與舊有代碼集成,避免重新編寫。

    * 實現可用類庫中所缺少的功能。舉例來說,在 Java 語言中實現 ping 時,您可能需要 Internet Control Message PRotocol (ICMP) 功能,但基本類庫并未提供它。

    * 最好與使用 C/C++ 編寫的代碼集成,以充分發掘性能或其他與環境相關的系統特性。

    * 解決需要非 Java 代碼的特殊情況。舉例來說,核心類庫的實現可能需要跨包調用或者需要繞過其他 Java 安全性檢查。

JNI 允許您完成這些任務。它明確分開了 Java 代碼與本機代碼(C/C++)的執行,定義了一個清晰的 API 在這兩者之間進行通信。從很大程度上說,它避免了本機代碼對 JVM 的直接內存引用,從而確保本機代碼只需編寫一次,并且可以跨不同的 JVM 實現或版本運行。

借助 JNI,本機代碼可以隨意與 Java 對象交互,獲取和設計字段值,以及調用方法,而不會像 Java 代碼中的相同功能那樣受到諸多限制。這種自由是一把雙刃劍:它犧牲 Java 代碼的安全性,換取了完成上述所列任務的能力。在您的應用程序中使用 JNI 提供了強大的、對機器資源(內存、I/O 等)的低級訪問,因此您不會像普通 Java 開發人員那樣受到安全網的保護。JNI 的靈活性和強大性帶來了一些編程實踐上的風險,比如導致性能較差、出現 bug 甚至程序崩潰。您必須格外留意應用程序中的代碼,并使用良好的實踐來保障應用程序的總體完整性。

本文介紹 JNI 用戶最常遇到的 10 大編碼和設計錯誤。其目標是幫助您認識到并避免它們,以便您可以編寫安全、高效、性能出眾的 JNI 代碼。本文還將介紹一些用于在新代碼或已有代碼中查找這些問題的工具和技巧,并展示如何有效地應用它們。

JNI 編程缺陷可以分為兩類:

    * 性能:代碼能執行所設計的功能,但運行緩慢或者以某種形式拖慢整個程序。
    * 正確性:代碼有時能正常運行,但不能可靠地提供所需的功能;最壞的情況是造成程序崩潰或掛起。

性能缺陷

程序員在使用 JNI 時的 5 大性能缺陷如下:

    * 不緩存方法 ID、字段 ID 和類
    * 觸發數組副本
    * 回訪(Reaching back)而不是傳遞參數
    * 錯誤認定本機代碼與 Java 代碼之間的界限
    * 使用大量本地引用,而未通知 JVM

不緩存方法 ID、字段 ID 和類

要訪問 Java 對象的字段并調用它們的方法,本機代碼必須調用 FindClass()、GetFieldID()、GetMethodId() 和 GetStaticMethodID()。對于 GetFieldID()、GetMethodID() 和 GetStaticMethodID(),為特定類返回的 ID 不會在 JVM 進程的生存期內發生變化。但是,獲取字段或方法的調用有時會需要在 JVM 中完成大量工作,因為字段和方法可能是從超類中繼承而來的,這會讓 JVM 向上遍歷類層次結構來找到它們。由于 ID 對于特定類是相同的,因此您只需要查找一次,然后便可重復使用。同樣,查找類對象的開銷也很大,因此也應該緩存它們。

舉例來說,清單 1 展示了調用靜態方法所需的 JNI 代碼:

清單 1. 使用 JNI 調用靜態方法

Java™ 本機接口(Java Native Interface,JNI)是一個標準的 Java API,它支持將 Java 代碼與使用其他編程語言編寫的代碼相集成。如果您希望利用已有的代碼資源,那么可以使用 JNI 作為您工具包中的關鍵組件 —— 比如在面向服務架構(SOA)和基于云的系統中。但是,如果在使用時未注意某些事項,則 JNI 會迅速導致應用程序性能低下且不穩定。本文將確定 10 大 JNI 編程缺陷,提供避免這些缺陷的最佳實踐,并介紹可用于實現這些實踐的工具。

Java 環境和語言對于應用程序開發來說是非常安全和高效的。但是,一些應用程序卻需要執行純 Java 程序無法完成的一些任務,比如:
    *  與舊有代碼集成,避免重新編寫。

    * 實現可用類庫中所缺少的功能。舉例來說,在 Java 語言中實現 ping 時,您可能需要 Internet Control Message Protocol (ICMP) 功能,但基本類庫并未提供它。

    * 最好與使用 C/C++ 編寫的代碼集成,以充分發掘性能或其他與環境相關的系統特性。

    * 解決需要非 Java 代碼的特殊情況。舉例來說,核心類庫的實現可能需要跨包調用或者需要繞過其他 Java 安全性檢查。

JNI 允許您完成這些任務。它明確分開了 Java 代碼與本機代碼(C/C++)的執行,定義了一個清晰的 API 在這兩者之間進行通信。從很大程度上說,它避免了本機代碼對 JVM 的直接內存引用,從而確保本機代碼只需編寫一次,并且可以跨不同的 JVM 實現或版本運行。

借助 JNI,本機代碼可以隨意與 Java 對象交互,獲取和設計字段值,以及調用方法,而不會像 Java 代碼中的相同功能那樣受到諸多限制。這種自由是一把雙刃劍:它犧牲 Java 代碼的安全性,換取了完成上述所列任務的能力。在您的應用程序中使用 JNI 提供了強大的、對機器資源(內存、I/O 等)的低級訪問,因此您不會像普通 Java 開發人員那樣受到安全網的保護。JNI 的靈活性和強大性帶來了一些編程實踐上的風險,比如導致性能較差、出現 bug 甚至程序崩潰。您必須格外留意應用程序中的代碼,并使用良好的實踐來保障應用程序的總體完整性。

本文介紹 JNI 用戶最常遇到的 10 大編碼和設計錯誤。其目標是幫助您認識到并避免它們,以便您可以編寫安全、高效、性能出眾的 JNI 代碼。本文還將介紹一些用于在新代碼或已有代碼中查找這些問題的工具和技巧,并展示如何有效地應用它們。

JNI 編程缺陷可以分為兩類:

    * 性能:代碼能執行所設計的功能,但運行緩慢或者以某種形式拖慢整個程序。
    * 正確性:代碼有時能正常運行,但不能可靠地提供所需的功能;最壞的情況是造成程序崩潰或掛起。

性能缺陷

程序員在使用 JNI 時的 5 大性能缺陷如下:

    * 不緩存方法 ID、字段 ID 和類
    * 觸發數組副本
    * 回訪(Reaching back)而不是傳遞參數
    * 錯誤認定本機代碼與 Java 代碼之間的界限
    * 使用大量本地引用,而未通知 JVM

不緩存方法 ID、字段 ID 和類

要訪問 Java 對象的字段并調用它們的方法,本機代碼必須調用 FindClass()、GetFieldID()、GetMethodId() 和 GetStaticMethodID()。對于 GetFieldID()、GetMethodID() 和 GetStaticMethodID(),為特定類返回的 ID 不會在 JVM 進程的生存期內發生變化。但是,獲取字段或方法的調用有時會需要在 JVM 中完成大量工作,因為字段和方法可能是從超類中繼承而來的,這會讓 JVM 向上遍歷類層次結構來找到它們。由于 ID 對于特定類是相同的,因此您只需要查找一次,然后便可重復使用。同樣,查找類對象的開銷也很大,因此也應該緩存它們。

舉例來說,清單 1 展示了調用靜態方法所需的 JNI 代碼:




發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 伊金霍洛旗| 巴林右旗| 巴中市| 新巴尔虎右旗| 大港区| 和平区| 平原县| 黔西| 始兴县| 刚察县| 石城县| 上林县| 大英县| 忻城县| 田东县| 清流县| 合江县| 灵璧县| 岗巴县| 涡阳县| 图木舒克市| 温泉县| 梁山县| 萨迦县| 锡林郭勒盟| 图们市| 荔波县| 宝山区| 清远市| 增城市| 阳谷县| 灵寿县| 贡觉县| 绥德县| 和龙市| 石楼县| 临颍县| 昌都县| 水城县| 湾仔区| 安岳县|