在Android Framework中,需要提供一种媒介或桥梁,将Java层(上层)与C/C++(底层)有机地联系起来,使得它们相互协调,共同完成某些任务。在这两层之间充当连接桥梁这一角色的就是Java本地接口(JNI,Java Native Interface),它允许Java代码与基于C/C++编写的应用和库进行交互操作。
JNI提供了一系列接口,允许Java类与使用C/C++等其它编程语言(在JNI中,这些语言被称为本地语言)编写的应用程序、模块、库进行交互操作。比如,在Java类中使用C语言库中中的特定函数,或在C语言里面使用Java类库,都需要借助JNI来完成。
通常会在下列几种情况下使用JNI
注重处理速度:如果对某段程序的执行速度有较高的要求,建议使用C/C++编写代码,而后在Java层通过JNI调用基于C/C++编写的部分代码。
硬件控制:为了更好地控制硬件,硬件控制代码通常使用C语言编写,借助JNI将其与Java层连接起来,从而实现对硬件的控制。
已有C/C++代码的复用:在编写程序的过程中,常常会使用已经编写好的C/C++代码,既提高了编程效率,又确保了程序的安全性和健壮性。在复用这些C/C++代码时,就要通过JNI来实现。
在Java代码中通过JNI调用C函数的步骤如下:
第一步:编写Java代码
第二步:编译Java代码(javac Java文件)
第三步:生成C代码头文件(javah java类名,自动生成)
第四步:编写C代码(实现C代码头文件里面的函数)
第五步:生成C共享库(使用工具编译生成C共享库,win下面为dll文件,Linux下面为so文件)
第六步:运行Java程序(java 类名)
第一步:编写Java代码
首先编写调用C语言的Java源代码HelloJNI.java
public classHelloJNI {native void printHello(); 1
native voidprintString(String str);static{
System.loadLibrary("hellojni"); 2}public static voidmain(String[] args) {//TODO Auto-generated metho