概述
Java要想调用C的程序,就要把C生成的DLL文件给Java调用,也就是要使用Java的本地化方法JNI调用C的DLL文件。Java本地接口JNI(Java Native Interface),设计目的是与C/C++实现本地交互。
实现
1、在Java类中声明native方法,在静态代码块中通过Sytem.loadLibrary("类名")来加载库文件;
2、编译Java类(javac java文件名);
3、生成扩展名为h的头文件(javah -jni java类名);
4、通过C/C++实现本地方法;
5、将本地方法生成动态链接库;
6、Java程序调用动态链接库。
示例
1、声明HelloWorld类,声明本地方法sayHello,加载HelloWorld库文件。
public class HelloWorld
{
static
{
System.loadLibrary("HelloWorld");
}
private native void sayHello();
public static void main(String[] args)
{
new HelloWorld().sayHello();
}
}
2、编译HelloWorld.java
javac HelloWorld.java
3、声称C语言头文件
javah -jni HelloWorld
4、实现本地方法
#include <stdio.h>
#include "HelloWorld.h"
JNIEXPORT void JNICALL Java_HelloWorld_sayHello(JNIEnv * env, jobject obj)
{
printf("Hello World in C!\n");
return;
}
5、声称动态库
find / -name "jni.h"
/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/include/jni.h
find / -name "jni_md.h"
/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/include/linux/jni_md.h
gcc -I/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/include/ -I/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/include/linux -fPIC -shared HelloWorld.c HelloWorld.h -o libHelloWorld.so
6、运行程序调用动态库
java -Djava.library.path=. HelloWorld