为了能够在项目中同时的坚固java和c++的特性,例如底层的硬件由c++操作,上层的应用由java去实现,那么这时就要用到JNI技术。当然,不只是这种单方面的java调用c++可以使用JNI,JNI是提供双向交互的接口,我们可以将java vm嵌入到应用程序中,例如浏览器中运行applet,当浏览器遇到applet标签时,浏览器会将标签内的内容交给java vm解释。
JNI编程----JAVA调用C++动态库
首先我们要将调用dll接口的JAVA类写出来:
JAVA代码如下:
public class HelloJni
{
public native void displayHelloJni();
static
{
System.loadLibrary("helloJni");
}
public static void main(String[] args)
{
new HelloJni().displayHelloJni();
}
}
文件名HelloJni.java,java中类的名字必须和文件名相同。
有了这个java的源码,我们就可以通过javac的指令生成HelloJni.class,再用javah生成头文件,这个头文件是我们在生成动态库时需要的。
头文件是这样的:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloJni */
#ifndef _Included_HelloJni
#define _Included_HelloJni
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloJni
* Method: displayHelloJni
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloJni_displayHelloJni
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
我们要根据生成的头文件来写dll,例如上面的这个头文件,我们在dll中就要定义Java_HelloJni_displayHelloJni(JNIEnv*,jobject)这样的接口。
下面是动态库的源代码:
#include <jni.h>
#include "HelloJni.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_HelloJni_displayHelloJni(JNIEnv *env, jobject obj)
{
printf("Hello Dynamic Link Library has been calling!\n");
printf("Java_HelloJni_displayHelloJni method has been executed!\n");
return;
}
添加完上述代码,我们编译链接,发现根本通过不了,这时我们要将之前生成的HelloJni.h头文件放到源代码的目录下,并且要在工程中包含jni.h,这个头文件是在jdk的include中。包含了这些我们的工程就完成了。可以在command中输入java HelloJni命令进行测试。
这是一个简单的JNI编程,其他的复杂的也都是这样的方式完成的。