先说几句废话,最近开始研究android框架了。一步步照着老罗的博客http://blog.csdn.net/luoshengyang进行。其中涉及到android框架层调用底层的c/c++代码。由于这种跨语言的操作的需要,那么随之而来就有了JNI的产生。
什么是JNI及其用途
JNI的英文名称叫做(java native interface)叫做java本地接口。专门进行跨语言操作使用。那么我们什么情况下就会有跨语言操作的需要呢?一方面:C/C++在性能上要比java效率高,因此对一些性能要求高的代码模块,我们就可以使用JNI;其次:假如说需要增加某项功能,Java中没有,恰巧C/C++中是有的。那么方便起见,我们就可以使用JNI了。
运行机制
我们要使用JNI方式的话,只需要经过六个步骤就ok了。先来张图,让我们了解个大概。
了解完大概的运行机制,我们来详细的进行说明并用代码加以实现,最后打印出”native“字样。
步骤一:首先,我们需要编写含有native方法的java文件。
在E:/Java/下面建立一个名叫Native.java 的类;
public class Native {
static{
System.loadLibrary("native.dll");
}
public native void show();
public static void main(String[] args) {
new Native().show();
}
}
这样就完成了我们的第一个步骤,接下来我们进行第二个步骤
步骤二:
这一步是将上述的java文件编译成class文件。我们在命令行中进行实现。打开cmd。切换到E:/Java 目录下,然后进行编译。
简单介绍下,javac命令是java compile的缩写。compile是编译的意思。
编译完成之后的话,我们会再E:/Java 目录下看到一个Native.class 文件。这就是我们编译后的class文件。
步骤三:获取java源码生成对应的c语言头文件。使用到的命令是我们的javah 。可以理解成是java head 的简写。在这一步容易出现一个问题。使用javah 命令之后很可能出现如下图所示情况:
出现这种情况的时候一定要淡定,你要知道其原因是我们的java环境变量配置有问题。 别不相信,可以对照这儿标准java环境变量配置进行比对。你会发现自己的配置肯定存在某些问题。好了,解决我们的环境变量配置的问题之后。使用命令 javah Native 或者 javah -classpath . Native 进行获取,操作之后,我们会看到在E:\Java文件夹下面生成一个Native.h 文件。
步骤四:编写对应的C语言实现代码;
首先,我们得下载vc6++ http://pan.baidu.com/share/link?shareid=271506&uk=3626331472 。下载、安装完成之后呢,我们就可以使用了。
接着,打开vc6++,新建如下图所示的工程区。工程名叫native
接着下一步:选择一个简单的DLL工程
接着切换左下角所示
然后的话
打开项目所在的文件目录,将步骤三中生成的Native.h文件复制到此目录。在Header Files上点击右键,选择Add Files to Folder…。选择Native.h文件,点击OK。
接着,打开StdAfx.h文件,再最后面添加:
#include <jni.h>
#include "Native.h"
接着打开Source Files文件夹下面的Native.cpp 文件 修改#include stdafx.h 为#include StdAfx.h。而后,打开Native.h 文件。复制选中为黑色的部分到Native.cpp 文件的最后面
并且加以修改
接着,我们之前看到在Native.h 中有jni.h 文件的引入。那么这个文件在什么地方呢。这个文件在我们的JDK安装目录下面。
我们通过菜单栏的工具、选项、目录将include 和win32文件夹引入进来。
之后的话,点击组件菜单里面的组件子菜单。之后的进入工程所在文件夹下面打开Debug文件夹,会发现,其中有一个Native.dll文件。
或者使用命令cl -LD jni_Native.cpp -Fe Native.dll,以上命令的参数中,-LD表示产生dll,-Fe后面表示产生dll的名字,具体的参数可以自己用cl -help命令查看,
步骤五:我们将其拷贝到编译好的class文件目录下面。
步骤六:使用java Native 命令执行,我们就会看到神奇的一幕出现了。