c++ - 如何从 C++ 中的字符指针获取 Java 字符串

标签 c++ arrays pointers char jna

我正在移植 openvr samplejogl ,在我们创建了 binding 之后与 jna。

几乎在最后(在渲染 Controller 和跟踪基站之前),我在尝试将 C 中的字符指针转换为 Java 中的字符串时遇到了困难。

C++代码here :

//-----------------------------------------------------------------------------
// Purpose: Helper to get a string from a tracked device property and turn it
//          into a std::string
//-----------------------------------------------------------------------------
std::string GetTrackedDeviceString( vr::IVRSystem *pHmd, vr::TrackedDeviceIndex_t unDevice, vr::TrackedDeviceProperty prop, vr::TrackedPropertyError *peError = NULL )
{
    uint32_t unRequiredBufferLen = pHmd->GetStringTrackedDeviceProperty( unDevice, prop, NULL, 0, peError );
    if( unRequiredBufferLen == 0 )
        return "";

    char *pchBuffer = new char[ unRequiredBufferLen ];
    unRequiredBufferLen = pHmd->GetStringTrackedDeviceProperty( unDevice, prop, pchBuffer, unRequiredBufferLen, peError );
    std::string sResult = pchBuffer;
    delete [] pchBuffer;
    return sResult;
}

GetStringTrackedDeviceProperty here :

/** Returns a string property. If the device index is not valid or the property is not a string type this function will 
* return 0. Otherwise it returns the length of the number of bytes necessary to hold this string including the trailing
* null. Strings will generally fit in buffers of k_unTrackingStringSize characters. */
virtual uint32_t GetStringTrackedDeviceProperty( vr::TrackedDeviceIndex_t unDeviceIndex, ETrackedDeviceProperty prop, VR_OUT_STRING() char *pchValue, uint32_t unBufferSize, ETrackedPropertyError *pError = 0L ) = 0;

定义 VR_OUT_STRING() 的地方 here作为:

# define VR_CLANG_ATTR(ATTR)

#define VR_OUT_STRING() VR_CLANG_ATTR( "out_string: ;" )

我已经做了类似的事情,我不得不调用一个函数,该函数期望指向 TrackedDevicePose_t 结构数组的指针:

private TrackedDevicePose_t.ByReference trackedDevicePosesReference = new TrackedDevicePose_t.ByReference();
public TrackedDevicePose_t[] trackedDevicePose
            = (TrackedDevicePose_t[]) trackedDevicePosesReference.toArray(VR.k_unMaxTrackedDeviceCount);

我首先创建了引用,然后从中创建了实际的数组。

但是here我不能有一个扩展 char 数组的类..

private String getTrackedDeviceString(IVRSystem hmd, int device, int prop, IntBuffer propError) {

    int requiredBufferLen = hmd.GetStringTrackedDeviceProperty.apply(device, prop, Pointer.NULL, 0, propError);

    if(requiredBufferLen == 0) {
        return "";
    }


    CharArray.ByReference charArrayReference = new CharArray.ByReference();
    char[] cs = charArrayReference.toArray(requiredBufferLen);

    return null;
}

apply ( here) 是:

public interface GetStringTrackedDeviceProperty_callback extends Callback {

    int apply(int unDeviceIndex, int prop, Pointer pchValue, int unBufferSize, IntBuffer pError);
};

CharArray 类,垃圾尝试 here

有什么想法吗?

最佳答案

我已经完成了一些 C 和 C++ 代码到 Java 的移植,虽然它可能非常 hacky,但我想出的最好的办法是解决指向 int 原语或指针的情况一个函数调用需要一个 char*/String,是创建一个具有单个属性的小包装类,将该对象传递给函数,根据需要更改属性,并在函数调用后检索新值。所以像这样:

public class StringPointer {
    public String value = "";
}

StringPointer pchBuffer = new StringPointer();
unRequiredBufferLen = pHmd.GetStringTrackedDeviceProperty( unDevice, prop, pchBuffer, unRequiredBufferLen, peError );
String sResult = pchBuffer.value;

GetStringTrackedDeviceProperty()

...
pchValue.value = "some string";
...

在这种情况下,您可以使用 String,因为这是您的代码在函数调用后使用 char* 执行的操作,但如果确实需要是一个 char[],你可以只创建 char[] pchBuffer = new char[unRequiredBufferLen]; 并将其传递给函数。就像您在 C++ 中使用 char* 一样,您在数组中所做的任何更改在函数结束后都将可见,您甚至可以执行 String sResult = new String (pchBuffer);.

关于c++ - 如何从 C++ 中的字符指针获取 Java 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39228233/

相关文章:

c - *(q + i * col + j)在此C程序中如何工作?

c - 不在 if 语句之外打印

c++进程cpu使用率跳转导致检测

android - 如何让手机从 Qt Android 振动

java - 如何获取字符串中的数字,然后计算它们的平均值?

arrays - 从 bash 数组中查找并显示唯一值

c++ - Intel one-api 编译器在编译 GDAL cpp 文件时出错

c++ - 如何将函数指针添加到现有的 va_list?

arrays - 在打印数组之前,如何确保 lineReader 已完成运行并填充数组

c - 指针作为函数的声明?