0

我们使用 jna 做了一个openvr java 绑定,他们通常所说的 jna 是真的,它很容易实现。

相反,它有一些性能损失。谷歌搜索并阅读一些论文,jna 比 jni 慢 10 到几乎 80 倍(这里这里)。

这对于非关键性能场景来说不是问题,但我们遇到了一些性能问题,我们正在尝试解决所有原因,例如绑定。

我搜索了一段时间,有很多不同的方法可以实现这一点,但鉴于我们想要移植的标题相对容易(最后一句名言......),我们正在尝试手动完成。

我从两个最重要的电话开始,VR_Init并且VR_ShutDown

inline IVRSystem *VR_Init( EVRInitError *peError, EVRApplicationType eApplicationType )
{
    IVRSystem *pVRSystem = nullptr;

    EVRInitError eError;
    VRToken() = VR_InitInternal( &eError, eApplicationType );
    COpenVRContext &ctx = OpenVRInternal_ModuleContext();
    ctx.Clear();

    if ( eError == VRInitError_None )
    {
        if ( VR_IsInterfaceVersionValid( IVRSystem_Version ) )
        {
            pVRSystem = VRSystem();
        }
        else
        {
            VR_ShutdownInternal();
            eError = VRInitError_Init_InterfaceNotFound;
        }
    }

    if ( peError )
        *peError = eError;
    return pVRSystem;
}

/** unloads vrclient.dll. Any interface pointers from the interface are
* invalid after this point */
inline void VR_Shutdown()
{
    VR_ShutdownInternal();
}

对应的java 类非常简单:

public class HelloVr {

    static {
        System.loadLibrary("openvr_api");
    }

    static final int VRInitError_None = 0, VRApplication_Scene = 1;

    public native IVRSystem VR_Init(ByteBuffer peError, int eApplicationType);

    public native void VR_Shutdown();

    public static void main(String[] args) {
        new HelloVr();
    }

    public HelloVr() {

        ByteBuffer peError = ByteBuffer.allocateDirect(Integer.BYTES).order(ByteOrder.nativeOrder());

        IVRSystem hmd = VR_Init(peError, VRApplication_Scene);

        System.out.println("error: " + peError.getInt(0));
    }

    class IVRSystem {

        private long nativePtr = 0L;
    }
}

现在是时候通过键入来编译HelloVr.javaHelloVr.class

javac HelloVr.java

但我得到Unexpected Token

PS C:\Users\GBarbieri\Documents\NetBeansProjects\Test\Test\src\test> "C:\Program Files\Java\jdk1.8.0_102\bin\javac.exe"
.\HelloVr.java
Unerwartetes Token ".\HelloVr.java" im Ausdruck oder in der Anweisung.
Bei Zeile:1 Zeichen:66
+ "C:\Program Files\Java\jdk1.8.0_102\bin\javac.exe" .\HelloVr.java <<<<
    + CategoryInfo          : ParserError: (.\HelloVr.java:String) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : UnexpectedToken

为什么?

4

1 回答 1

0

不完全是我正在寻找的理想答案,但它使它工作。

我将javac.exe直接添加到PATH环境变量中并简单地运行:

javac HelloVr.java
于 2016-10-10T13:55:41.763 回答