jni 绑定、javac 错误、意外标记

jni binding, javac error, unexpected token

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

相反,它有一些性能损失。谷歌搜索和阅读一些论文,jna 比 jni (here and here) 慢 10 到近 80 倍。

这对于 not-critical 性能场景来说不是问题,但我们 运行 遇到了一些性能问题,我们正在努力解决所有原因,例如绑定。

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

我从 two most important callsVR_InitVR_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 class很简单:

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.java 编译成 HelloVr.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

为什么?

这不是我一直在寻找的理想答案,但它确实有效。

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

javac HelloVr.java