JNI的出现使得开发者既可以利用Java语言跨平台、类库丰 富、开发便捷等特点,又可以利用Native语言的高效。

JNI是JVM实现中的一部分,因此Native语言和Java代码都运行在JVM的宿主环境。

JNI是一个双向的接口:开发者不仅可以通过JNI在Java代码中访问Native模块,还可以在 Native代码中嵌入一个JVM,并通过JNI访问运行于其中的Java模块。可见,JNI担任了一个桥梁的角色,它将JVM与Native模块联系起 来,从而实现了Java代码与Native代码的互访。在OPhone上使用Java虚拟机是为嵌入式设备特别优化的Dalvik虚拟机。每启动一个应 用,系统会建立一个新的进程运行一个Dalvik虚拟机,因此各应用实际上是运行在各自的VM中的。Dalvik VM对JNI的规范支持的较全面,对于从JDK 1.2到JDK 1.6补充的增强功能也基本都能支持。

缺点:由于Native模块的使用,Java代码会丧失其原有的跨平台性和类型安全等特性。此外,在JNI应用中,Java代码与Native代 码运行于同一个进程空间内;对于跨进程甚至跨宿主环境的Java与Native间通信的需求,可以考虑采用socket、Web Service等IPC通信机制来实现。

互的类型可以分为在Java代码中调用Native模块和在Native代码中调用Java模块两种。

Java调用Native模块

HelloJni.java

[java] view plain copy
  1. /* A native method that is implemented by the
  2. * 'hello-jni' native library, which is packaged
  3. * with this application.
  4. */
  5. public native String  stringFromJNI();

, 20)));

  • }
  • }
  • Nadd.java
  • package com.hello.jnitest;
  • public class Nadd {
  • static {
  • System.loadLibrary("hello_jni");
  • }
  • public native int nadd(int a, int b);
  • }