JNI(Java Native Interface)

实例:采用jni,调用C语言编写的dll,该dll负责打印出“Hello World,^_^. JNI……..”
1、 编写java程序:

1):HelloWorld.java

Public class HelloWorld{	Static{		System.loadLibraray(“HelloWorld_C”);    //这个名字就是dll文件的文件名	}		Private native void showHelloWorld();		Public void printHelloWorld(){		showHelloWorld();	}	}
2):cmd  javac HelloWorld.java           生成HelloWorld.class
3):cmd  javah HelloWorld               生成HelloWorld.h
内容如下:


4):编写包含main函数的类:HelloWorld_Test.java

public class HelloWorld_Test {	public static void main(String[] args) {		new HelloWorld().printHelloWorld();	}}

5):cmd javac HelloWorld_Test.java

2、编写HelloWorld_C.c

#include “jni.h”#include “HelloWorld.h”      //这个就是刚才用javah命令生成的那个文件JNIEXPORT void JNICALL Java_HelloWorld_showHelloWorld(JNIEnv * env, j  obj){      	//这个方法就是上图红色框住的部分,方法签名必须一样,不过要加上形参名字:JNIEnv * env, j  obj	//方法体里写具体实现	printf(“Hello World,^_^. JNI……..”);}
3、通过使用vs2010 的 “Visual Studio 命令提示(2010)”,输入如下命令:
cl –LD HelloWorld_C.c   //就是刚才编写的c文件,然后生成如下文件

注:1)、HelloWorld_C.c保存格式最好采用Unicode编码
2)、并非一定要使用vs2010的这个工具,肯定存在其他工具。由于本机上安装有vs2010,所以使用它了。至于还有其他哪些工具,这里就没有具体研究了。
3)、使用vs2010的这个工具时,需要将jni.h文件与HelloWorld.java文件放在一起。其实是和HelloWorld.h文件放在一起。

4、cmd java HelloWorld_Test,结果如下:


总结:从main函数入口开始执行,发现需要调用本地方法,于是去加载指定的dll文件。但是到底执行该dll里的哪个方法呢?会根据本地方法名按照某种特定的算法计算出该dll中的方法名,于是去执行该方法。(当然以上过程肯定是有出入的,这里只是提出一个大概的思路)。

收藏 打印