首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用JNI访问变体的SafeArray

使用JNI访问变体的SafeArray
EN

Stack Overflow用户
提问于 2011-09-07 19:07:29
回答 1查看 1K关注 0票数 0

我有一个VB6 ActiveX DLL,它的函数返回一个变体。该变体包含一个节点变体数组,每个变体包含一个字符串名和两个数据数组(string和double)。我正试图通过JNI将其作为jobject返回给Java程序。

通过调用适当的VB函数并将变体结果存储为SAFEARRAY,我可以访问节点的外部数组。它可以访问维数,得到上下界。但是,我不能通过SafeArrayGetElement()或SafeArrayAccessData()访问每个节点。我总是得到一个无效的参数异常。

1)我是否可以直接将SAFEARRAY (或变体)传递给jobject,而无需迭代C++中的节点?

2)我是否使用了错误的参数来获取SAFEARRAY数据?是否需要预先分配访问指针(var)的大小?

代码语言:javascript
复制
    SAFEARRAY* outarr = t->VBFunction(&bstrparam).GetVARIANT().parray;

//Returns correct dimension (1)
    printf("JNI GetNodes_States: Got array, dimension %d\n", outarr->cDims);

//Returns correct bounds
    LONG lBound, rBound;
    SafeArrayGetLBound(outarr, 1, &lBound);
    SafeArrayGetUBound(outarr, 1, &rBound);
    printf("JNI GetNodes_States: Bounds [%d, %d]\n", lBound, rBound);

//Returns Invalid Argument error (hresult=0x80070057)
    //Gets first element
    LONG* indexArray = new LONG[outarr->cDims];
    for(unsigned short i=0; i<outarr->cDims; ++i)
        indexArray[i] = 0;
    _variant_t var;
    hresult = SafeArrayGetElement(outarr, indexArray, (void*)&var);

    if (SUCCEEDED(hresult)){
        printf( "JNI GetNodes_States: %s, %d\n", "", outarr->cDims);
    }
    else {
        printf( "JNI GetNodes_States Access Error:%X\n", hresult);
        outobj = NULL;
    }

    delete[] indexArray;
EN

回答 1

Stack Overflow用户

发布于 2011-09-09 03:46:53

1)是否可以直接将SAFEARRAY (或变体)传递给jobject,而无需迭代C++中的节点?

恐怕绝对不是。您将遍历数组,提取所有必需的值,并将它们转换为Java将理解的内容。

2)我是否使用了错误的参数来获取SAFEARRAY数据?是否需要预先分配访问指针(var)的大小?

最可疑的参数是indexArray,为每个维度设置为0。但是,如果该数组是由Visual创建的,则很可能它是一个基于1的数组,而不是基于0的数组,这将使0的索引成为非法。

这就是为什么您的元素提取代码需要注意SafeArrayGetLBoundSafeArrayGetUBound的结果。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7339233

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档