Refri2010的个人博客分享 http://blog.sciencenet.cn/u/Refri2010

博文

Java类库和JNI

已有 6736 次阅读 2010-3-27 21:59 |个人分类:编程技术|系统分类:科研笔记| NIST, java类库, JNI


【图1 Java类库和JNI的关系】

【Java类库】
使用Java类库的目的,是因为想实现的功能,已经有现成的代码程序。

① 但是使用者对于程序内部计算方法并不是很关心,只是想简单调用。
② 如果已有的功能程序是java语言的,可以将该程序放进自己编写的程序Project中,合为一体。
但是可能计算程序十分复杂,文件比较多,自己的程序只是很小一部分,这样做就显得不合适;
③ 另外有些计算程序的作者,并不想公开自己的代码,只是想提供一个结果。

以上原因,就产生了java类库的要求,将现成的代码程序封装起来,
只提供必要的接口,并且制作后的类库体积较小。

【JNI】
如果现有的功能程序是非java语言的,此时就需要通过JNI,用java语言调用非java语言。

【实际操作】
以NIST的RefProp软件为例,该软件的物性计算部分全部是用Fortran语言编写的。
并且软件提供了C++语言调用Fortran源程序的DLL文件。

也就说说,在C++的程序中,可以通过已有的DLL文件调用Fortran程序。
-----------------------------------------------
还需要实现:
① Java类库的调用。
自己编写的Java程序,通过java类库,计算冷媒物性;
② 制作Java类库。
类库中的类调用根据C++语言制作的DLL文件;
③ 制作C++语言的DLL文件。
实现C++调用Fortran源程序。

【图2 实现流程图】

具体实现步骤:

① 编写java类库文件: *.java
② 生成C++的头文件: *.h
③ 编写C++的主文件: *.cpp ,调用DLL文件1
④ 生成DLL文件2
⑤ 制作java类库,生成JAR文件。

----------------------------------------------------

所有的操作都是在NetBeans下进行。

① 编写java类库文件: *.java

· Projects的性质,选择为【Java Class Library】
· NetBeans建议类文件尽量保存在包【package】中。
· 该类文件不能有主函数main( )

程序简单代码如下:

package NIST;

public class RefPropJ {
static {
System.loadLibrary("RefPropJ");
}
public native void initial();
public native void setR410A();
  --- ---此处省略 --- --- ---  
}


② 生成C++的头文件: *.h

首先将①中编写做好的.java文件,【build】生成.class文件。
然后,在DOS窗口的命令行格式下将.class文件,生成C++的头文件。
C:--略--buildclasses>javah -o RefPropJ.h NIST.RefPropJ

生成RefPropJ.h头文件。

③ 编写C++的主文件: *.cpp ,调用Fortran的DLL文件

在BetBeans环境下,编写C++语言的动态链接库。
· Projects的性质,选择为【C/C++ Dynamic Library】

在之前,需要对NetBeans进行设置,才能进行C++语言的操作。
具体设置,请网上搜索。

按照自动生成的RefPropJ.h头文件格式,
自己编写对应的RefPropJ.cpp文件。
在cpp文件中,参照NIST提供的例子程序,调用NIST提供的DLL文件。

④ 生成C++的DLL文件

完成之后,还要对该项目的【Property】进行必要设置。

【图3 设置1--C++DLL文件的生成设置】

【图4 设置2--C++DLL文件的输出位置】

【 Clean and Build 】,生成C++的动态链接库。

⑤ 制作java类库,生成JAR文件。

将NIST提供的DLL文件和自己制作的C++ DLL文件,放到①中编写的java类库的根文件夹下。
【图5设置--Java类库(JAR)文件的输出位置】

【 Clean and Build 】,
生成java类库文件JAR文件。

至此得到了java类库文件。
--------------------------------------------------------
⑥ Java类库文件的保存位置
一般,将自己制作的类库文件存放在JDK的安装目录下
如: C:Javalib

⑦ Java类库(JAR)文件的使用

编写自己的java程序。

· 将已有的Java类库文件加入到项目中。
【图6 加入类库】

NetBeans中的项目列表中有一项library。

· 还要将两个DLL文件放到项目的根目录下。
· 还要加上import NIST.RefrPropJ

此时就可以使用java类库了。

【补充】

软件的打包。与生成类库的操作基本一致。

NetBeans会自动将所使用的类库,集中起来放在dist文件夹下的lib文件夹内。
但是dll文件没有自动放进来,需要自己放进去。

此时,双击生成的JAR文件。
效果就像是在NetBeans下运行源程序一样。这就是软件的打包。


注意:
因为该文中的类库,最终是调用了NIST的物性计算程序,所以将打包后得到的JAR文件放到一个没有安装NIST的电脑中,程序还是不能正常运行。



https://blog.sciencenet.cn/blog-412518-306693.html

上一篇:[Java的报错信息之一] Non-static variable/method cannot be referenced from a static cont
下一篇:为什么做好的热电偶,附着在被测温表面时,需要使用绝缘胶或绝缘胶带?
收藏 IP: .*| 热度|

0

发表评论 评论 (1 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-11-28 18:53

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部