简介

JNI是java语言提供的Java和C/C++相互沟通的机制,Java可以通过JNI调用本地的C/C++代码,本地的C/C++的代码也可以调用java代码。JNI 是本地编程接口,Java和C/C++互相通过的接口。Java通过C/C++使用本地的代码的一个关键性原因在于C/C++代码的高效性。

NDK是一系列工具的集合。它提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。这些工具对开发者的帮助是巨大的。它集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。它可以自动地将so和Java应用一起打包,极大地减轻了开发人员的打包工作。

Java通过JNI机制和C/C++沟通的具体步骤

1、编写包含native本地方法的java类
2、通过javah工具生成C/C++语言的头文件
3、使用C/C++语言实现头文件
4、使用交叉编译工具对C/C++本地代码进行编译,最后通过链接生成*.so可执行的C/C++库
5、实际执行Java代码去和本地的C/C++代码互相沟通

JNI中的JavaVM与JNIEnv对象

在标准的Java平台下,每个Process里可以产生很多JavaVM对象,每个JavaVM对象都有一个与之对应的JavaVM对象,但是在Android平台上,每个Process只能产生一个DalvikVM对象,也就是说在一个Android的进程中是通过有且只有一个虚拟器对象来服务所有Java和C++代码的。
1、JNIEnv *内部包含一个Pointer,Pointer指向Dalvik的JavaVM对象的Fanction Table,JNIEnv *关于程序执行环境的众多函数正是来源于Dalvik虚拟机
2、Android中每当一个Java线程第一次要调用本地C/C++代码时,Dalvik虚拟机实例会为该Java线程产生一个JNIEnv *指针
3、Java每条线程在和C/C++互相调用时,JNIEnv*是相互独立的,互不干扰
4、每本地的C/C++代码想获得当前线程所要使用的JNIEnv时,可以使用Dalvik VM对象的Java VM* jvm->getEnv()方法,该方法即会返回当前线程所在的JNIEnv*

Java、Dalvik VM、C/C++的运行机制与流程

在Android的NDK中,Java、C/C++、Dalvik VM关系如下:
1、java的dex字节码和C/C++的*.so同时运行DalvikVM之内,共同使用一个进程空间。每次使用jni调用c/c++开辟一个线程去处理
2、java和C/C++可以相互调用,调用的关键是DalvikVM
3、一般而言,比较经典的模式是Java通过JNI的C组建和C++相互沟通,一般业务处理放在C/C++中
4、C++代码处于核心控制地位更具价值

当java需要C/C++代码时,在DalvikVM虚拟机中加载动态链接库时,会先调用JNI_Onload()函数,此时就会把javaVM对象的指针存储于C层JNI组建的全局环境中,在JAVA层调用C层的本地库函数时,调用C本地函数线程必然通过Dalvik VM来调用C本地函数,测试Dalvik虚拟机会为本地的C组建实例化一个JNIEnv指针,该指针指向Dalvik虚拟机的具体函数列表,当JNI的C组件调用java层方法和属性时,需要通过JNIEnv指针来进行调用。

当C++组件主动调用Java层方法时,需要通过JNI的C组件把JNIEnv指针传递给C++组件,此后,c++组件即可通过JNIEnv指针来掌控Java层代码。

总结

对于JNI和NDK很多Android开发初学者没有搞明白这个问题,JNI是Java调用Native机制,是Java语言自己的特性全称为Java Native Interface,类似的还有微软.Net Framework上的p/invoke,可以让C#或Visual Basic.Net可以调用C/C++的API,所以说JNI和Android没有关系,在PC上开发Java的应用,如果运行在Windows平台使用JNI是是经常的,比如说读写Windows的注册表。而NDK是Google公司推出的帮助Android开发者通过C/C++本地语言编写应用的开发包,包含了C/C++的头文件、库文件、说明文档和示例代码,我们可以理解为Windows Platform SDK一样,是纯C/C++编写的,但是Android并不支持纯C/C++编写的应用,同时NDK提供的库和函数功能很有限,仅仅处理些算法效率敏感的问题,所以Android123推荐初学者学好Java后再学习JNI。

简单点说,用C语言生成一个库文件,在java中调用这个库文件的函数。JNI的过程比较复杂,生成.so需要大量操作,而NDK就是简化了这个过程。

NDK 与 JNI 的关系相关推荐

  1. 研究ffmepg中有感(NDK 与 JNI 的关系)

    简介 原文地址:   http://blog.csdn.net/banketree/article/details/12167145 JNI是java语言提供的Java和C/C++相互沟通的机制,Ja ...

  2. Android之SDK、NDK、JNI和so文件

    Android之SDK.NDK.JNI和so文件 1.     SDK Android SDK(AndroidSoftware Development Kit),即Android软件开发工具包,And ...

  3. Android JNI(一)——NDK与JNI基础

    前言 ndk开发是高级Android 开发必备的技能,也是很多Android开发工程师难以逾越的门槛,因此,学习ndk开发已经是高级Android必备技能,所以我尝试把自己ndk开发经验记录下来,不知 ...

  4. NDK篇 - JNI NDK 初探

    前几天一直在忙项目,所以断更了两天,今天继续写.进入到 NDK 篇了,先来了解下 NDK 与 JNI,后面的文章将带大家来交叉编译一些成熟的开源项目. 目录: 什么是 JNI 什么是 NDK Andr ...

  5. NDK,动态链接库,JNI

    jni是java调用本地方法(c.c++写的),android 下用JNI需要.so文件,NDK就是能够方便快捷开发.so文件的工具.使用NDK的基本思路就是将本地代码(native code)编译成 ...

  6. android和和jni的关系,Android.mk与jni目录的关系

    附1: Android.mk与jni目录的关系: 在某目录下,如/src/modules1/下存放Android.mk和Application.mk,调用ndk-build试图编译时,会遇到如下错误: ...

  7. linux android ndk r9b JNI 开发过程(COCOS2D-X配置)

    我是小白 折腾了两天了. 终于成功第一次运行- 网上一堆教程乱死了然后其实现在android官方已经认定NDK为必要开发环境所以现在的配置其实很简单 另外Cocos2d-x的编译真是奇怪死了对一个只把 ...

  8. android jni 调用java_Android 基于NDK的JNI开发 C调用java和java调用C

    首先,这里所要讲的主要是C调用java的,因为这里网上也没有一个详细的资料,其次,我开发android应用没多久,其中java错误敬请谅解! 关于配置NDK环境问题应该不用再赘述了,这个网上有很多,只 ...

  9. Android NDK之JNI陷阱

        背景: 最近一个月一直在做移植库的工作,将c代码到share library移植到Android平台.这就涉及到Android NDK(native develop kit)内容.这里只想记录 ...

最新文章

  1. 实战:手把手教你用朴素贝叶斯对文档进行分类
  2. 基于改进的点对特征的6D位姿估计
  3. 【渝粤题库】广东开放大学 秘书理论与实务 形成性考核
  4. 第十九讲:职责链模式
  5. 今年护网蓝队防御具体实施方案
  6. proc sys文件系统对比
  7. QCC3071与QCC3072有什么区别?
  8. java升序降序排列desc_Sql--order by、desc降序、top
  9. 吴裕雄--天生自然 诗经:望海潮·东南形胜
  10. 【Oracle】并行等待之PX Deq: Table Q Normal
  11. u盘中的隐藏文件该怎样恢复
  12. 计算机专业考计量经济学,计量经济学期末考试题库(完整版)及答案()(47页)-原创力文档...
  13. ArcGIS中根据DEM提取等高线和高程点(附练习数据)
  14. maya2018英文翻译_maya2018mac版如何改成英文?
  15. 《C语言点滴》参考文献
  16. 地址栏中输入网址后发生了什么?
  17. 什么是readout function/readout函数
  18. 星际战甲服务器维护时间,星际战甲
  19. DaVinci DM6437 中文教程
  20. 人工智能之Python人脸识别技术--face_recognition模块

热门文章

  1. org.apache.shiro.ini不存在 shiro不能导包
  2. 035_jQuery Ajax的ajaxSetup方法
  3. 001_JavaScript简介
  4. 畅捷通t+标准版操作手册_外网IP访问畅捷通T+教程
  5. ont维修使能工具_上海OTC机器人维修保养以及调试服务了解
  6. 09day ASM单实例安装部署,并在ASM上安装oracle数据库
  7. python实验指导书2018_python实验指导书
  8. oracle增量合并存储过程,怎么将视图与存储过程里的逻辑合并
  9. Linux下的DNS服务器搭建
  10. instant.now时区不正确_Centos8如何更改时区