zoukankan      html  css  js  c++  java
  • 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 上瘾了...... 

  • 相关阅读:
    内存溢出和内存泄漏的区别
    各种集合类的区别以及原理
    如何设置java虚拟机参数
    [机器学习] 简单的机器学习算法和sklearn实现
    [机器视觉] SIFT特征-尺度不变特征理解
    [学习笔记] Markdown语法备忘
    [学习总结] python语言学习总结 (三)
    [学习笔记]Linux下mysql的基础操作
    [学习笔记] C++ 历年试题解析(三)--小补充
    [学习总结] python语言学习总结 (二)
  • 原文地址:https://www.cnblogs.com/H-BolinBlog/p/6093887.html
Copyright © 2011-2022 走看看