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. java使用JNA调用dll

    1.自己搞一个dll出来.参考下面链接 http://blog.csdn.net/lqena/article/details/46357165. 2.下载jar jna-4.2.1.jar. 3.复制 ...

  2. 转:使用 Nginx Upload Module 实现上传文件功能

    普通网站在实现文件上传功能的时候,一般是使用Python,Java等后端程序实现,比较麻烦.Nginx有一个Upload模块,可以非常简单的实现文件上传功能.此模块的原理是先把用户上传的文件保存到临时 ...

  3. struts2学习问题(一)

    一.struts2 Unknown tag (s:property). 解释:不识别标签 解决:这是sturts2的标签,导入相应的包<%@taglib prefix="s" ...

  4. HASHMAP原理解析,不错的文章

    http://blog.csdn.net/vking_wang/article/details/14166593

  5. NYOJ 42 一笔画问题 (并查集+欧拉回路 )

    题目链接 描述 zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下来. 规定,所有的边都只能画一次,不能重复画.   输入 第一行只有一个正整数 ...

  6. bzoj 2705 数学 欧拉函数

    首先因为N很大,我们几乎不能筛任何东西 那么考虑设s(p)为 gcd(i,n)=p 的个数,显然p|n的时候才有意义 因为i与n的gcd肯定是n的因数,所以那么可得ans=Σ(p*s(p)) 那么对于 ...

  7. Linux curl命令【curl】

    命令:curl 在Linux中curl是一个利用URL规则在命令行下工作的文件传输工具,可以说是一款很强大的http命令行工具.它支持文件的上传和下载,是综合传输工具,但按传统,习惯称url为下载工具 ...

  8. suse下自动启动脚本

    suse下自动启动脚本 http://blog.csdn.net/herobox/article/details/8961358 suse下自动启动脚本 也许你对SUSE Linux很了解,也许你不太 ...

  9. python多线程实现多任务

    #转载请联系 1.什么是线程? 进程是操作系统分配程序执行资源的单位,而线程是进程的一个实体,是CPU调度和分配的单位.一个进程肯定有一个主线程,我们可以在一个进程里创建多个线程来实现多任务. --- ...

  10. Bootstrap模态框垂直居中展示的方法

    在bootstrap.js中加入以下代码: