Java通过JNI调用C++动态链接库

项目需要java调用C++写的模块,在网上找到了java可以用jni调用C++的动态链接库。自己照着网上的方法调试通过。下面是调试过程。本文资料主要参考一下三个链接:


JAVA通过JNI调用本地方法,而本地方法是以库文件的形式存放的(在WINDOWS平台上是DLL文件形式,在UNIX机器上是SO文件形式)。通过调用本地的库文件的内部方法,使JAVA可以实现和本地机器的紧密联系,调用系统级的各接口方法。
一、JAVA中所需要做的工作

例如程序testdll.java,内容为:
public class testdll
{

 //在JAVA程序中,首先需要在类中声明所调用的库名称。在这里,库的扩展名字可以不用写出来,究竟是DLL还是SO,由系统自己判断。
 static
 {
  System.loadLibrary("hello");
 }

 //还需要对将要调用的方法做本地声明,关键字为native。并且只需要声明,而不需要具体实现。
 public native static int get();
 public native static void set(int i);


 public static void main(String[] args)
 {
  testdll test = new testdll();
  test.set(10);
  System.out.println(test.get());
 }
}

然后编译该JAVA程序文件,生成CLASS,再用JAVAH命令,JNI就会生成C/C++的头文件。

用javactestdll.java编译它,会生成testdll.class。
再用javah testdll,则会在当前目录下生成testdll.h文件,这个文件需要被C/C++程序调用来生成所需的库文件。

 

二、C/C++中所需要做的工作

对于已生成的testdll.h头文件,C/C++所需要做的,就是把它的各个方法具体的实现。然后编译连接成库文件即可。再把库文件拷贝到JAVA程序的路径下面,就可以用JAVA调用C/C++所实现的功能了。
用vs2015新建vc++ -> 类库项目,项目名称与 System.loadLibrary("hello"); 中的hello相同。将javah生成的testdll.h中内容拷贝到工程的hello.h文件,在hello.cpp文件中加入如下代码:

int i= 0;
JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass)
{
 return i;
}
JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint j)

{
 i = j;
}
编译时要用到一些Java里面的头文件,所以应该把位于下面目录

D:\jdk6\include

中的所有文件都拷到

C:\Program Files\Microsoft Visual Studio 8\VC\include

目录下,或者将所需要的头文件拷贝到工程头文件目录里,例如:

2,拷贝C:\Program Files\Java\jdk1.7.0_01\include下的jni.h文件

和C:\ProgramFiles\Java\jdk1.7.0_01\include\win32下的jni_md.h文件

到c++程序中,并加入程序中。

 

 

上面两个路径依自己的机子而定

若不拷到这里的话,也可以明确指定路径。或者在java程序目录下建立一个include目录,将

D:\jdk6\include 

中的所有文件都拷到该目录中。要不然会报错,说找不jni.h文件。

在vc2015中的工程项目属性中选中C/C++,在右边的附加包含目录项中加入目录:E:\ProgramLib\Java\testdll\include(这是我java程序所在的目录)。然后编译链接生成dll文件。

将生成的DLL文件放在 C:\WINDOWS\system32 目录下,或者放在与Java程序位于相同的目录下。

 

你可能感兴趣的:(日常,java开发中小问题解决)