JNI之Java调用C++动态库
日期:2014-08-26点击次数:7838
JNI(Java Native Interface),Java本地化编程接口,是Java SDK的一部分,实现了Java和其他语言的交互。通过JNI,Java可以调用其他语言编写的本地动态库。现在就Java通过JNI调用C++动态库,做一个简单的描述。
本实例的试验环境:
项目 |
描述 |
操作系统 |
Windows 7 |
开发工具 |
Eclipse 4.4 |
JDK8 |
Visual studio 2008 |
以下演示Java调用C++动态库的过程。
首先在Eclipse中创建一个名为“Sum”的Project,在Project中创建一个Java类“Sum”,并用native声明由本地动态库实现的方法“Add”。
public class Sum {
public native int Add(int a, int b);
static
{
System.loadLibrary("SumDll");
}
public static void main(String[] args)
{
System.out.println(new Sum().Add(1, 1));
}
} |
上述代码中我们用native声明了有两个参数的方法Add,由native声明的方法,不需要Java类实现,它表明该方法由其他本地动态库实现,只需要加载 该本地动态库,本实例中本地动态库的名字为“SumDll”。
编写完Java类之后,cmd到Sum.java文件目录下,用javac命令编译所编写的java类,生成Sum.class。然后运行“javah Sum”命令生成Sum.h头文件。
Sum.h的内容如下:
有了Sum.h头文件我们需要通过C++实现其中的函数(方法)。
在VS2010中创建一个名为“SumDll”的动态库项目。因为需要用到“jni.h”,所以在SumDll项目属性中 将“C:\Program Files\Java\jdk1.8.0_05\include”、“C:\Program Files\Java\jdk1.8.0_05\include\win32”目录添加到“附加包含目录”项中。
在SumDll项目中导入上面生成的“Sum.h”头文件,并创建一个CPP文件“Sum.cpp”实现“Sum.h”文件中的方法。Sum.cpp内容如下:
#include "stdafx.h"
#include "Sum.h"
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: Sum
* Method: Add
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_Sum_Add
(JNIEnv *pEnv
,jobject obj
,jint nParam1
,jint nParam2)
{
return nParam1 + nParam2;
}
#ifdef __cplusplus
}
#endif |
编译项目,生成SumDll.dll,将SumDll.dll拷贝至Java工程目录下,运行Java程序,控制台输出结果:
软件部 段苏敏