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