有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何从jna引用指针检索java类

在我们用jna创建了binding之后,我正在将openvr sample移植到jogl

几乎在结束之前(在渲染控制器和跟踪基站之前),我试图从C++中的引用指针检索java中的模型类。p>

C++代码here:

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

    ThreadSleep( 1 );
}

{}{a5}:

/** 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上,我试图以这种方式加载模型(here):

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();
<^ >但是^ {CD2>}是空的,即^ {< CD3>}是空的,^ {< CD4>}是0,C++上有有效的值代替…

<>如何从C++中的引用指针检索java类?


共 (2) 个答案

  1. # 1 楼答案

    解决后,我需要创建一个指针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();
    
  2. # 2 楼答案

    这里有一点简单:

    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();
        }
    }