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 上瘾了......