為了在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的解析,附上運作結果和代碼:
運作結果:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2QvwVe0lmdhJ3ZvwFM38CXlZHbvN3cpR2Lc1TPB10QGtWUCpEMJ9CXsxWam9CXwADNvwVZ6l2c052bm9CXUJDT1wkNhVzLcRnbvZ2LcZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39TO0EjMwkzM2EzNyUDM2EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
代碼:
//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();
}
}
}