C++ 如何从C++;

C++ 如何从C++;,c++,arrays,pointers,char,jna,C++,Arrays,Pointers,Char,Jna,在我们用jna创建了之后,我正在把这个移植到 几乎在最后(在渲染控制器和跟踪基站之前),我在尝试将C中的字符指针转换为Java中的字符串时遇到了麻烦 C++代码: GetStringTrackedDeviceProperty: 其中VR\u OUT\u STRING()定义为: 我已经做过类似的事情,我必须调用一个函数,该函数期望指针指向TrackedDevicePose\t结构的数组: private TrackedDevicePose_t.ByReference trackedDeviceP

在我们用jna创建了之后,我正在把这个移植到

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

C++代码:

GetStringTrackedDeviceProperty

其中
VR\u OUT\u STRING()
定义为:

我已经做过类似的事情,我必须调用一个函数,该函数期望指针指向
TrackedDevicePose\t
结构的数组:

private TrackedDevicePose_t.ByReference trackedDevicePosesReference = new TrackedDevicePose_t.ByReference();
public TrackedDevicePose_t[] trackedDevicePose
            = (TrackedDevicePose_t[]) trackedDevicePosesReference.toArray(VR.k_unMaxTrackedDeviceCount);
我首先创建了引用,然后从中创建了实际数组

但是我不能让一个类扩展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
()是:

CharArray类,垃圾尝试


>我有一些想法,C和C++代码移植到java,虽然它可能是可怕的HKY,但我想出了最好的方法,其中一个指针指向一个代码< int 原语或一个<代码> char *//>代码>字符串>代码,需要用一个属性创建一个小包装类,将该对象传递到函数中,根据需要更改属性,并在函数调用后检索新值。比如:

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

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


在这种情况下,您可以使用
字符串
,因为这是您的代码在函数调用后对
char*
所做的,但是如果它确实需要是
char[]
,您可以创建
char[]pchBuffer=new char[unrequired bufferen]并将其传递到函数中。这就像在C++中使用了<代码> char */CODE >,并且在函数结束后,数组内的任何更改都将可见,甚至可以执行<代码>字符串sReals=新字符串(pchBuffing);<代码> < /p>你的代码是C++,不是C。这些是不同的语言,它们的区别很重要。此外,我不知道java在哪里进入它。如果您想直接与Java接口,那么就需要JNI,而我看不到任何JNI。如果你有一个更松散的交互,比如通过中间文件或管道,那么这些细节很重要。是的,你是对的,约翰,谢谢,我刚刚修复了它。Java加入了绑定,我现在也添加了它。作为旁白--
pHmd->GetStringTrackedDeviceProperty
--如果此函数的实现抛出了
,您的
GetTrackedDeviceString
由于
新字符[Unrequired BufferLen]而出现内存泄漏
JNA自动处理从以NUL结尾的C字符串到Java
String
的转换。它还提供了
Native.toString()
来手动执行转换。有趣的想法,我将尝试一下,关于第一种方法,我不能这么说,因为
GetStringTrackedDeviceProperty
属于
接口GetStringTrackedDeviceProperty\u callback
的类型,
扩展了callback
,因此它不能有任何主体。然而,我也尝试了你的第二个技巧,通过将参数从jna
Pointer
更改为
char[]
,它可以工作,但我得到了一个奇怪的结果,
桬扟獡獥慴楴湯癟癩E<代码>代码,在C++上,我得到了<代码>灯塔< /代码>…C++部分可能使用单字节字符。如果您将每个
char
分解为各自的字节,这是否得到了正确的答案?从char切换到字节缓冲区工作正常,亲爱的,谢谢!Ps:让我添加这个,使用jna
Native.toString(buffer)
而不是
newstring(buffer)
自动删除任何结尾空间
private TrackedDevicePose_t.ByReference trackedDevicePosesReference = new TrackedDevicePose_t.ByReference();
public TrackedDevicePose_t[] trackedDevicePose
            = (TrackedDevicePose_t[]) trackedDevicePosesReference.toArray(VR.k_unMaxTrackedDeviceCount);
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;
}
public interface GetStringTrackedDeviceProperty_callback extends Callback {

    int apply(int unDeviceIndex, int prop, Pointer pchValue, int unBufferSize, IntBuffer pError);
};
public class StringPointer {
    public String value = "";
}

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