开发学院手机开发Android 开发 Android JNI详述 阅读

Android JNI详述

 2010-07-15 20:31:00 来源:WEB开发网   
核心提示:Android JNI 知识简介Java Native Interface (JNI) 标准是java 平台的一部分,它允许Java 代码和其他语言写的代码进行交互,Android JNI详述,JNI 是本地编程接口,它使得在 Java 虚拟机 (VM) 内部运行的 Java 代码能够与用其它编程语言( 如 C 、C+

Android JNI 知识简介

Java Native Interface (JNI) 标准是java 平台的一部分,它允许Java 代码和其他语言写的代码进行交互。JNI 是本地编程接口,它使得在 Java 虚拟机 (VM) 内部运行的 Java 代码能够与用其它编程语言( 如 C 、C++ 和汇编语言) 编写的应用程序和库进行交互操作。

1. 从如何载入.so 档案谈起

由于Android 的应用层的类都是以Java 写的,这些Java 类编译为Dex 型式的Bytecode 之后,必须靠Dalvik 虚拟机(VM: Virtual Machine) 来执行。VM 在Android 平台里,扮演很重要的角色。

此外,在执行Java 类的过程中,如果Java 类需要与C 组件沟通时,VM 就会去载入C 组件,然后让Java 的函数顺利地调用到C 组件的函数。此时,VM 扮演着桥梁的角色,让Java 与C 组件能通过标准的JNI 介面而相互沟通。

应用层的Java 类是在虚拟机(VM: Vitual Machine) 上执行的,而C 件不是在VM 上执行,那么Java 程式又如何要求VM 去载入(Load) 所指定的C 组件呢? 可使用下述指令:

System.loadLibrary(*.so 的档案名);

例如,Android 框架里所提供的MediaPlayer.java 类,含指令:

public class MediaPlayer{

static {

System.loadLibrary("media_jni");

}

}

这要求VM 去载入Android 的/system/lib/libmedia_jni.so 档案。载入*.so 之后,Java 类与*.so 档案就汇合起来,一起执行了。

2. 如何撰写*.so 的入口函数

---- JNI_OnLoad() 与JNI_OnUnload() 函数的用途

当Android 的VM(Virtual Machine) 执行到System.loadLibrary() 函数时,首先会去执行C 组件里的JNI_OnLoad() 函数。它的用途有二:

(1) 告诉VM 此C 组件使用那一个JNI 版本。如果你的*.so 档没有提供JNI_OnLoad() 函数,VM 会默认该*.so 档是使用最老的 JNI 1.1 版本。由于新版的JNI 做了许多扩充,如果需要使用JNI 的新版功能,例如JNI 1.4 的java.nio.ByteBuffer, 就必须藉由JNI_OnLoad() 函数来告知VM 。

(2) 由于VM 执行到System.loadLibrary() 函数时,就会立即先呼叫JNI_OnLoad() ,所以C 组件的开发者可以藉由JNI_OnLoad() 来进行C 组件内的初期值之设定(Initialization) 。

例如,在Android 的/system/lib/libmedia_jni.so 档案里,就提供了JNI_OnLoad()

1 2 3 4 5 6  下一页

Tags:Android JNI 详述

编辑录入:coldstar [复制链接] [打 印]
[]
  • 好
  • 好的评价 如果觉得好,就请您
      0%(0)
  • 差
  • 差的评价 如果觉得差,就请您
      0%(0)
赞助商链接