Java 如何使用JNR按值返回结构?
我正在尝试使用JNR从Java代码使用本机库。我调用的函数在openh264的C头文件中定义,用于返回一个简单的struct by value:Java 如何使用JNR按值返回结构?,java,openh264,jnr,Java,Openh264,Jnr,我正在尝试使用JNR从Java代码使用本机库。我调用的函数在openh264的C头文件中定义,用于返回一个简单的struct by value: typedef结构\u tagVersion{ 未签名的int-uMajor; 无符号整数; 无符号整数; 未签名的整数; }OpenH264版本; OpenH264版本WelsGetCodecVersion(无效); 我编写了以下Java副本: 公共类OpenH264版本扩展结构{ 公共OpenH264版本(运行时){ 超级(运行时); } pub
typedef结构\u tagVersion{
未签名的int-uMajor;
无符号整数;
无符号整数;
未签名的整数;
}OpenH264版本;
OpenH264版本WelsGetCodecVersion(无效);
我编写了以下Java副本:
公共类OpenH264版本扩展结构{
公共OpenH264版本(运行时){
超级(运行时);
}
public Unsigned32 uMajor=新的Unsigned32();
public Unsigned32或=新Unsigned32();
public Unsigned32 uRevision=新Unsigned32();
public Unsigned32 uReserved=新Unsigned32();
}
公共接口OpenH264{
公共OpenH264版本WelsGetCodecVersion();
}
最后尝试一下:
OpenH264-OpenH264=LibraryLoader.create(OpenH264.class)
.加载(“openh264”);
openH264版本=openH264.WelsGetCodecVersion();
但是,返回的版本有错误的值(并且每次调用的值都不同)。该库是在Windows 10 x64上运行的x64。
我可以用JNI+JavaCpp加载相同的库,返回值是正确的。
我遗漏了什么?我问了类似的问题:我当前的解决方案是将struct作为“@pinted@Out”参数返回,但我可以修改本机代码。出于好奇,您需要从JavaCPP获得什么才能继续使用它而不是切换到JNR?@SamuelAudet,JavaCPP自动化了大部分过程,但仍然需要本机编译和绑定本机lib。但由于这个问题,我们继续使用JavaCpp,像JNR这样的书籍不支持这一点(因为JNI不支持这一点),正如这里所解释的:@SamuelAudet,openh264允许在应用程序按需下载原始二进制文件时免版税使用。