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 calls、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 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
我们使用 jna 进行了 openvr java 绑定,他们通常所说的 jna 是真的,它很容易实现。
相反,它有一些性能损失。谷歌搜索和阅读一些论文,jna 比 jni (here and here) 慢 10 到近 80 倍。
这对于 not-critical 性能场景来说不是问题,但我们 运行 遇到了一些性能问题,我们正在努力解决所有原因,例如绑定。
我搜索了一段时间,有很多不同的方法可以实现这一点,但是鉴于 header 我们想要移植相对容易(最后一句名言..)我们正在努力手动完成。
我从 two most important calls、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 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