没有合适的资源?快使用搜索试试~ 我知道了~
首页Android JNI 知识简介(Java Native Interface )
Java Native Interface (JNI)标准是 java 平台的一部分,它允许Java代码和其他语言写的代码进行交互。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()函数,
(可参考 android SDK 中 android_media_MediaPlayer.cpp)其程式码片段为:
//#define LOG_NDEBUG 0

















安全验证
文档复制为VIP权益,开通VIP直接复制

评论3