Tags标签 网战地图
当前位置: 主页 > 编程语言 > Android >

[Android的系统移植与平台开发]JNI介绍

2014-06-06 13:53 [Android] 来源于:
导读:JNI是在学习Android HAL时必须要面临一个知识点,如果你不了解它的机制,不了解它的使用方式,你会被本地代码绕的晕头转向,JNI作为一个中间语言的翻译官在运行Java代码的Android中有着重要的意义,这儿的内容比较多,也是最基本的,如果想彻底了解JNI的机制

JNI是在学习Android HAL时必须要面临一个知识点,如果你不了解它的机制,不了解它的使用方式,你会被本地代码绕的晕头转向,JNI作为一个中间语言的翻译官在运行Java代码的Android中有着重要的意义,这儿的内容比较多,也是最基本的,如果想彻底了解JNI的机制,请查看:

 

本文结合了网友ljeagle写的JNI学习笔记和自己通过JNI的手册及Android中常用的部分写得本文。

JNI学习笔记:

让我们开始吧!!


----------------------------------------------------------------------------------------

JNI概念

JNI是本地语言编程接口。它允许运行在JVM中的Java代码和用C、C++或汇编写的本地代码相互操作。

在以下几种情况下需要使用到JNI:

l  应用程序依赖于特定平台,平台独立的Java类库代码不能满足需要

l  你已经有一个其它语言写的一个库,并且这个库需要通过JNI来访问Java代码

l  需要执行速度要求的代码实现功能,比如低级的汇编代码

通过JNI编程,你可以使用本地方法来:

l  创建、访问、更新Java对象

l  调用Java方法

l  捕获及抛出异常

l  加载并获得类信息

l  执行运行时类型检查


JNI的原理

[Android的系统移植与平台开发]JNI介绍 _www.fengfly.com

 

JVM将JNI接口指针传递给本地方法,本地方法只能在当前线程中访问该接口指针,不能将接口指针传递给其它线程使用。在VM中 JNI接口指针指向的区域用来分配和存储线程本地数据。

当Java代码调用本地方法时,VM将JNI接口指针作为参数传递给本地方法,当同一个Java线程调用本地方法时VM保证传递给本地方法的参数是相同的。不过,不同的Java线程调用本地方法时,本地方法接收到的JNI接口指针是不同的。
 

加载和链接本地方法
 

 

在Java里通过System.loadLibrary()来加载动态库,但是,动态库只能被加载一次,因此,通常动态库的加载放在静态初始化语句块中。

 

  1. package pkg;    
  2. class Cls {   
  3.      native double f(int i, String s);      // 声明为本地方法  
  4.      static {   
  5.          System.loadLibrary(“pkg_Cls”);     // 通过静态初始化语句块来加载动态库  
  6.      }   
  7. }   
  8.  

通常在动态库中声明大量的函数,这些函数被Java调用,这些本地函数由VM维护在一张函数指针数组中,在本地方法里通过调用JNI方法RegisterNatives()来注册本地方法和Java方法的映射关系。

[Android的系统移植与平台开发]JNI介绍 _www.fengfly.com
 


 

(编辑:)

本文标签:
网友评论

栏目列表

推荐文章