繁体   English   中英

如何从JNA参考指针检索Java类

[英]How to retrieve java class from jna reference pointer

在使用jna创建绑定之后,我将openvr示例移植到jogl

几乎在最后(渲染控制器和跟踪基站之前),我陷入了尝试从C ++中的引用指针检索Java中的模型类的困境。

C ++代码在这里

while ( 1 )
{
    error = vr::VRRenderModels()->LoadRenderModel_Async( pchRenderModelName, &pModel );
    if ( error != vr::VRRenderModelError_Loading )
        break;

    ThreadSleep( 1 );
}

LoadRenderModel_Async 在这里

/** Loads and returns a render model for use in the application. pchRenderModelName should be a render model name
* from the Prop_RenderModelName_String property or an absolute path name to a render model on disk. 
*
* The resulting render model is valid until VR_Shutdown() is called or until FreeRenderModel() is called. When the 
* application is finished with the render model it should call FreeRenderModel() to free the memory associated
* with the model.
*
* The method returns VRRenderModelError_Loading while the render model is still being loaded.
* The method returns VRRenderModelError_None once loaded successfully, otherwise will return an error. */
virtual EVRRenderModelError LoadRenderModel_Async( const char *pchRenderModelName, RenderModel_t **ppRenderModel ) = 0;

jna将其翻译为( here ):

public interface LoadRenderModel_Async_callback extends Callback {

    int apply(Pointer pchRenderModelName, PointerByReference ppRenderModel);
};

在Java上,我试图以这种方式( 在此处 )加载模型:

int error;
PointerByReference modelPtrRef = new PointerByReference();

while (true) {

    Pointer stringPointer = new Memory(modelName.length());

    error = renderModels.LoadRenderModel_Async.apply(stringPointer, modelPtrRef);

    if (error != VR.EVRRenderModelError.VRRenderModelError_Loading) {
        break;
    }

    try {
        Thread.sleep(1);
    } catch (InterruptedException ex) {
        Logger.getLogger(ModelsRender.class.getName()).log(Level.SEVERE, null, ex);
    }
}

RenderModel_t m = new RenderModel_t(modelPtrRef.getValue());
m.read();

但是m为空,即vertexData为null且vertexCount为0,在c ++上,我具有有效的值。

我应该如何从C ++中的引用指针检索Java类?

这有点简单:

if (errorBuffer.get(0) != VR.EVRRenderModelError.VRRenderModelError_None) {
    return null;
}

int error;
PointerByReference pref = new PointerByReference();

while (true) {

    error = renderModels.LoadRenderModel_Async.apply(modelName, pref);

    if (error != VR.EVRRenderModelError.VRRenderModelError_Loading) {
        break;
    }

    try {
        Thread.sleep(1);
    } catch (InterruptedException ex) {
        Logger.getLogger(ModelsRender.class.getName()).log(Level.SEVERE, null, ex);
    }
}
RenderModel_t model = new RenderModel_t(pref.getValue());


public class RenderModel_t {
    public RenderModel_t(Pointer p) {
        super(p);
        read();
    }
}

解决了,我需要创建一个指针modelPtr ,然后一个指针的指针modelPtrPtr并传递到LoadRenderModel_Async

最后,我通过将指针的值传递给指针和read()实例化模型类,以从本机内存到堆内存检索值:

    RenderModel_t.ByReference modelPtr = new RenderModel_t.ByReference();

    if (errorBuffer.get(0) != VR.EVRRenderModelError.VRRenderModelError_None) {
        return null;
    }

    int error;
    PointerByReference modelPtrPtr = new PointerByReference(modelPtr.getPointer());

    while (true) {

        Pointer stringPointer = new Memory(modelName.length() + 1);
        stringPointer.setString(0, modelName);

        error = renderModels.LoadRenderModel_Async.apply(stringPointer, modelPtrPtr);

        if (error != VR.EVRRenderModelError.VRRenderModelError_Loading) {
            break;
        }

        try {
            Thread.sleep(1);
        } catch (InterruptedException ex) {
            Logger.getLogger(ModelsRender.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    RenderModel_t model = new RenderModel_t(modelPtrPtr.getValue());
    model.read();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM