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

JNI概述的更多相关文章

  1. JNI 概述【转】

    本文转载自:http://wiki.jikexueyuan.com/project/jni-ndk-developer-guide/overview.html 相信很多做过 Java 或 Androi ...

  2. 深入理解JNI

    深入理解JNI 最近在学习android底层的一些东西,看了一些大神的博客,整体上有了一点把握,也产生了很多疑惑,于是再次把邓大神的深入系列翻出来仔细看看,下面主要是一些阅读笔记. JNI概述 JNI ...

  3. Android JNI 学习(一):JNI 简介

    JNI 即 Java Native Interface 是 native 编程接口,它允许在Java虚拟机(VM)内运行Java代码与其他编程语言(主要是C和C++)编写的应用程序和库进行交互操作. ...

  4. Android深入理解JNI(一)JNI原理与静态、动态注册

    前言 JNI不仅仅在NDK开发中应用,它更是Android系统中Java与Native交互的桥梁,不理解JNI的话,你就只能停留在Java Framework层.这一个系列我们来一起深入学习JNI. ...

  5. 深入浅出 - Android系统移植与平台开发(十二)- Android JNI机制

    第五章.JNI机制 4.1 JNI概述 由前面基础知识可知,Android的应用层由Java语言编写,Framework框架层则是由Java代码与C/C++语言实现,之所以由两种不同的语言组合开发框架 ...

  6. JNI基础

    1.JNI概述 JNI 是 Java Native Interface 的缩写,中文译为“Java 本地调用”.通俗的说JNI是一种技术,通过这种技术我们可以做到以下两点:  1)Java 程序中的函 ...

  7. JNI原理与静态、动态注册

    前言 JNI不仅仅在NDK开发中应用,它更是Android系统中Java与Native交互的桥梁,不理解JNI的话,你就只能停留在Java Framework层.这一个系列我们来一起深入学习JNI. ...

  8. Java安全之JNI绕过RASP

    Java安全之JNI绕过RASP 0x00 前言 前面一直想看该JNI的相关内容,但是发现JNI的资料还是偏少.后面发现JNI在安全中应用非常的微妙,有意思. 0x01 JNI概述 JNI的全称叫做( ...

  9. 深入浅出 - Android系统移植与平台开发(十) - led HAL简单设计案例分析

    作者:唐老师,华清远见嵌入式学院讲师. 通过前两节HAL框架分析和JNI概述,我们对Android提供的Stub HAL有了比较详细的了解了,下面我们来看下led的实例,写驱动点亮led灯,就如同写程 ...

随机推荐

  1. ${pageContext.request.contextPath}的解释以及和request.contextPath的区别

    JSP中究竟采用绝对路径还是采用相对路径随着所采用技术的越来越复杂,这个问题也变得越来越难以解决. 1)采用相对路径遇到的问题 l 相对路径固然比较灵活,但如果想复制页面内的代码却变得比较困难,因为不 ...

  2. Drupal7所见即所得模块CKEditor

    初学Drupal(7.26),刚好遇到一个需要用到CKEditor模块的项目,于是就摸索着把它给装上了. 图片上传出问题 回到Drupal7的管理页面后刚好发现了对于CKEditor的“状态报告”(错 ...

  3. 【uva10829-求形如UVU的串的个数】后缀数组+rmq or 直接for水过

    题意:UVU形式的串的个数,V的长度规定,U要一样,位置不同即为不同字串 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&am ...

  4. python3 线程_threading模块

    '''并发:同一个时间段内运行多个程序的能力 进程就是一个程序在一个数据集上的一次动态执行过程.进程一般由程序.数据集.进程控制块三部分组成 程序:食谱数据集:鸡蛋.牛奶.糖等进程控制块:记下食谱做到 ...

  5. 让你的软件飞起来:RGB转为YUV【转】

    转自:http://blog.csdn.net/wxzking/article/details/5905195 版权声明:本文为博主原创文章,未经博主允许不得转载. 朋友曾经给我推荐了一个有关代码优化 ...

  6. linux设备驱动中的并发控制【转】

    转自:http://www.cnblogs.com/plinx/archive/2013/01/28/2873121.html 在linux内核中,主要的静态发生于以下几种情况: 1.对称多处理器(S ...

  7. 记录一次lnmp故障报告

    业务架构图: nginx 状态监控图: 本次故障的表现为:前端php页面无法打开,空白页或者502错误. nginx中php配置如下: location ~ \.php$ { root /xxx/xx ...

  8. win 7 浏览器被篡改小插曲

    今天下班回家,打开台式机发现IE,火狐都被篡改了.作为运维都会有点强迫症.这是个桌面系统,实在是没兴趣捣鼓.但是还是没办法,经常要用.等我下次有空了,直接换linux好了. 于是开始排查问题吧: 1. ...

  9. getRequestDispatcher

    request.getRequestDispatcher("/xx/xx.jsp").forward( request, response); http://blog.csdn.n ...

  10. selenium 常用浏览器操作API

    package test; import org.openqa.selenium.By;import org.openqa.selenium.Dimension;import org.openqa.s ...