为了在Java开发环境中使用DCMTK,做了以下工作:
(1)选择Java调用C++的工具
通过比较和测试JNI、JNA、BridJ、SWIG和JNative,考虑易用性和功能性,选择了JNative(
a.下载jnative.jar 及JNativeCpp.dll ;
b. jnative.jar 加载到当前工程下;
c.将使用的dll文件及JNativeCpp.dll拷贝至系统system32下或项目根目录,一定要通过dll查看器将涉及到所有dll文件都拷贝到根目录下 。 )(2)编译动态库dll
为了在Java环境中可以调用C++库,需要生成其的动态链接库,Qt封装的DCMTK的动态库已编译好。
(3)Java调用DCMTK
现在进入通过JNative,Java调用DCMTK阶段。JNative无法对调用Qt的导出类,只能调用导出函数,现在正在进行函数封装,对封装后的函数进行调用可以实现DICOM的解析。
现在已经成功实现Java调用DCMTK的DLL,完成DICOM信息tag的解析,附上运行结果和代码:
运行结果:
代码:
//20160520 将获取tag的函数封装好了 【dcx】
public String getTag(int pFile,String tag) throws NativeException, IllegalAccessException {
JNative vTag = null;
try {
vTag =new JNative("SpiderDicomFileD", "ParseTag");
int i = 0;
vTag.setRetVal(Type.STRING);
vTag.setParameter(i++, pFile);
//String tag="0018,1110"
//substring(0,m)截取[0,m)之间的子字符串 substring(m)截取[m,end]之间的子字符串
String getFirst = tag.substring(0,4);
String getSecond = tag.substring(5);
//String getSecond = tag.substring(tag.indexOf(",") + 1);
//十六进制转十进制 Integer.parseInt("0018",16) 给tag传入代号
vTag.setParameter(i++, Integer.parseInt(getFirst,16));
vTag.setParameter(i++, Integer.parseInt(getSecond,16));
vTag.invoke();
return vTag.getRetVal();
}
finally{
if (vTag !=null){
vTag.dispose();
}
}
}