映射类型:char **&在JNA

时间:2014-04-23 11:15:13

标签: java c++ jna

我的客户给了我一些功能。其中之一是:

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");

返回垃圾。

知道怎么解决吗?

提前致谢!

2 个答案:

答案 0 :(得分:2)

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

c code。

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,String path,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));

    }
抱歉我的英语不好。

答案 1 :(得分: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**&是对一个的引用,意味着它可以从函数内部设置 - 并且它不能在JNA(和JNI)使用的纯C中使用。

我建议将其包装到C-linkable代码中 - 确保它不会抛出异常,使用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语言中调用的东西。也许here你可以找到更多有关如何使用C-linkable函数包装库的信息。