[Qboy原創]java
2013年12月28日 測試
在開發一個項目過程當中須要調用第三方的C的dll。因爲是第一次在項目中使用JNA,不少都安裝開發文檔來作,可是出現了不少的問題。 因爲不少接口還沒調完,還不知道接下去有多少問題。先把已經發現的記錄下來吧。指針
1、long類型接口
在其中一個接口中有一個方法以下定義:ip
void* CreatePoint(const char* pip,const long port,const char* name);內存
看到這個,我很快的寫出了開發
Pointer CreatePoint(String pip,long port,String name);文檔
測試報錯,錯誤是Invaild memory access,看了很長的一段時間也沒發現本身哪裏寫錯了,雖然也知道是內存地址非法。也試了不少種,好比把String 改成Pointer,改爲byte[]但是仍是會報錯。最後實在找不到問題緣由了,就本身按照接口用C寫了一個dll,接口同樣,可是方法實現以下:pip
void* CreatePoint(const char* pip,const long port,const char* name){class
cout<<pip<<endl;
cout<<port<<endl;
cout<<name<<endl;
}
最終發現前兩個都能正常的輸出,而第三個就是死活不行,這就更讓我鬱悶了,這究竟是爲何呢?一樣是const char*爲何還有不一樣的待遇呢,何況把地址輸出來以後也是0?後來在公司的璐璐的提醒下,把中間那long類型的參數去掉試試,一發現原來是那個long類型做怪。 可是究竟是怎麼回事呢?後來在璐璐的提醒下是否是兩個開發語言中對long類型的長度定義是否是不一致,把java中的long改爲了int來試試,發如今name也輸出了。在C中sizeof(long)發現是4個字節,而Long.Size=64(8個字節) int是32位(4個字節),一切都明白了。
2、自覺得是的定義不少Pointer的子類
因爲在c語言中有一個typedef 能夠很好的對於類型進行自定義。在這個項目中存在不少的將void *轉換成其餘比較好記的數據類型,因爲對方也沒有給了這種類型數據的結構。我第一感受就是這些類型不太好記,我是否是也定義一些Pointer類型的子類。
當接口返回一個void*類型時,拋出一個異常,沒法將Pointer類型轉換成我本身定義的子類,我才明白,我太自覺得是了。
3、接口中的Memory
因爲第一個問題中也用過用Memory來分配空間要記住一下。
4、int*的處理
一開始看到這個時候也蒙了一下,JAVA裏但是沒有指針的啊,怎麼傳這個,可是在C/C++中傳這樣的參數好像很正常的。
後來在com.sum.jnj.ptr包中發現了不少類,好比IntByRefrence。我想int*應該要用這個來傳值吧。在這個包中也存在不少其餘的類型。