潜水了很久,一直只是免费享用各位前辈的宝贵资源和经验,从不曾作出任何贡献,想来汗颜。在此献丑纂文一篇,希望对其他人有些微帮助,至于老鸟看官们,对鄙人文中的才疏学浅还请一笑而过。

 

我在一个工业自动化的公司就职,从事嵌入式系统的设计和编程。前阵子公司要做一个项目,是用一台PC上位机去控制印刷机组上面的8个控制模块,每个控制模块的芯片是ARM 7 LPC2200系列。通讯协议选用CAN现场总线。控制模块的电路板是自家设计的,由于项目时间比较紧,CAN总线通讯部分没有时间DIY,就从厂商手里直接进了一块CAN总线的PCI-E通讯卡插在PC机上,上位机的控制程序是用JAVA写的,但是该CAN总线通讯卡提供的库函数来自VC++的DLL,而且其源代码不公开,这就需要在JAVA里调用本地DLL方法。具体步骤如下:

 

1.首先将要生成的C++本地方法在JAVA代码中声明,比如如果要添加的本地方法是CAN_Reset(),则在JAVA代码(i.e. CplusplusInterface.java)中添加:public static void CAN_Reset();,同时,假设生成的DLL文件为nativeMethod.dll,则在java代码中还需要加载本地DLL:

System.loadLibrary("nativeMethod.dll");

 

2.该java文件编译生成的.class类文件拷贝至JAVA home的目录下面,在命令行下进入JAVA home的路径运行:

Javah –jni CplusplusInterface生成CplusplusInterface.h头文件

 

3. 在VC中建立一个新的win32 dll项目,包含该头文件,然后对所有本地方法进行定义。将生成的DLL文件拷贝放进java.library.path指向的路径中,之后就可以在JAVA中调用C++的本地方法。如果不知道java.library.path路径在哪里,可以在java中添加System.out.println(System.getProperty("java.library.path"));并运行。

 

 

如果要调用一些不公开源代码的DLL中的方法,需要多一个步骤,即在自己生成的DLL中包含第三方提供的DLL库,自己编写调用过程,生成中转的DLL后,再在JAVA中调用自己编写的DLL中的方法