簡體   English   中英

類型的映射:JNA中的char **&

[英]Mapping of type: char**& in JNA

我的客戶給了dll幾個功能。 其中之一是:

int GetVersions(char* name, char** &pVersions);

它返回給定名稱的多個版本以及具有這些版本的字符串數組。 使用JNA,我試圖在接口中編寫等效的Java方法:

int GetVersions(String name, String ll, ??? pVersions);

問題是應該使用什么類型而不是???

我試圖將PointerByReference放在那里,在方法調用之后,我得到了:

Pointer ptr = ptrRef.getValue();
String ppp = ptr.getStringarray(0);

但是我到了這里Invalid memory access

Pointer ptr = ptrRef.getValue();
String ppp = ptr.getString(0, "UTF-8");

返回垃圾。

知道如何解決嗎?

提前致謝!

使用PointerByReference進行char **映射。 例如。

C代碼。

char ** xs_directory(struct xs_handle * h,uint32_t t,const char * path,unsigned int * num);

JNA:

PointerByReference xs_directory(XenstoreLibrary.xs_handle h,int t,字符串路徑,IntBuffer num);

這是一個xenstore api獲取目錄的內容,num是PointerByReference指針計數。 我使用此代碼來獲取指針值。

PointerByReference pbr = XenstoreLibrary.INSTANCE.xs_directory(xs_handle,tran,“ / local / domain / 0”,intBuffer);

    int n = intBuffer.get();

    Pointer[] arrays = pbr.getPointer().getPointerArray(0,n);

    for (int i = 0; i < arrays.length; i++) {

        Pointer array = arrays[i];

        System.out.println(array.getString(0));

    }

對不起,我英語不好。

據我了解,這在C語言中的工作方式如下:

char** versions; // char* versions[];
char   name [] = "some_name";

int size = GetVersions(name, &versions);
// now versions[0] to versions[size-1] are string literals of available versions

char**可以解釋為字符串文字數組( String[] )。 char**&是對one的引用,這意味着可以從內部函數中進行設置-不適用於JNA(和JNI)使用的純C語言。

我建議將其包裝到C可鏈接的代碼中-確保它不會引發異常,使用extern "C"並將所有引用替換為指針。 例如類似

extern "C" int CGetVersions(char* name, char*** pVersions) {
    return GetVersions(name, *pVersions);
}

然后,您應該可以使用PointerByReference來保存pVersions

ptrRef;                                       // (void**)
ptrRef.getValue();                            // *(void**) ->(void*)
ptrRef.getValue().getStringArray(0,returned); // (char**) (void*) -> (char**) -> String[]

基本上,C ++的工作原理與C不同,並且JNA和JNI均設計為可與C一起使用,因此您必須精簡您在純C語言中不會調用的所有內容。也許在這里,您可以找到有關如何包裝庫的更多信息C鏈接功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM