JNI概述
JNI是Java Native Interface的縮寫,它提供了若干的API實現了Java和其他語言的通信(主要是C&C++)。
JNI 讓你在利用強大 Java 平臺的同時,使你仍然可以用其他語言寫程序。 作為 JavaVM 的一部分,JNI 是一套雙向的接口,允許 Java 與本地代碼間的互操作。?
作為雙向接口,JNI 支持兩種類型本地代碼:本地庫和本地應用。
? 用本地代碼實現 Java 中定義的 native method 接口,使 Java 調用本地代碼 (即是Java層調用Native層代碼(主要是C、C++))
? 通過 JNI 你可以把 Java VM 嵌到一個應用程序中,此時 Java 平臺作為應用程序的增
強,使其可以調用 Java 類庫 (即是Native層調用Java層代碼)
交互圖:
?
注意事項:
首先,脫離 Java 后,可移植性問題你要自己解決,且需重新在其他平臺編譯鏈接本地庫。
第二,要小心處理 JNI 編程中各方面問題和來C/C++語言本身的細節性問題,處理不當,應用將崩潰。
一般性原則:
做好應用程序架構,使 native methods 定義在盡可能少的幾個類里。?(不要太分散,不好管理,查看)
學習 JNI 編程是個漫長的實踐過程,會碰到無數問題。
用 C/C++編程,常見問題有內存泄露,指針越界...,此外使用了 JNI,還要面對 JavaVM的問題:
? 在本地代碼中 new 一個 Java 對象后期望在本地代碼中維護此對象的引用,如何避免被 GC?
? Java 面向對象語言的封裝性被破壞了,Java 類中任何方法和屬性對 JNI 都是可見的,不管它是 public 的,還是 private/protected/package 的
? 對 LocalRef/GlobalRef 管理不善,會引發 Table Overflow Exception,導致應用崩潰
? 從 JNI 調用 Java 的過程不是很直觀,往往幾行 Java 代碼能搞定的事情,用 JNI 實現卻要幾百行雖然,有這樣多問題,逃避不了,你就認了吧。 經過一段時間的實踐,當你能熟練處理這些問題時,就會,眉頭一皺,文思泉涌,指尖飛舞,瞬間幾百行代碼誕生了,一個 make全部編譯通過,這時的你肯定已經對 JNI 上癮了......?
?
轉載于:https://www.cnblogs.com/H-BolinBlog/p/6093887.html
總結
- 上一篇: Django 发布时间格式化
- 下一篇: theano 安装杂记