JNA開發中的問題積累

      [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*應該要用這個來傳值吧。在這個包中也存在不少其餘的類型。

相關文章
相關標籤/搜索