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, jobject obj){
//这个方法就是上图红色框住的部分,方法签名必须一样,不过要加上形参名字:JNIEnv * env, jobject 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中的方法名,于是去执行该方法。(当然以上过程肯定是有出入的,这里只是提出一个大概的思路)。