Java Kotlin JNA正在将声明的字段名设置为空列表
下面的代码深受和的启发,我正试图让它使用Kotlin语言,而不是答案中给出的Java 它基本上基于JNA(Java Native Access),它从Windows本机库(在C++上)中提取有关笔记本电脑电池的信息 这段代码在Java版本中可以正常工作,但如果我尝试对Kotlin执行同样的操作,我会得到一个异常,即声明的字段名是一个空列表/数组Java Kotlin JNA正在将声明的字段名设置为空列表,java,kotlin,struct,jna,Java,Kotlin,Struct,Jna,下面的代码深受和的启发,我正试图让它使用Kotlin语言,而不是答案中给出的Java 它基本上基于JNA(Java Native Access),它从Windows本机库(在C++上)中提取有关笔记本电脑电池的信息 这段代码在Java版本中可以正常工作,但如果我尝试对Kotlin执行同样的操作,我会得到一个异常,即声明的字段名是一个空列表/数组 fun main(){getBatteryState()} fun getBatteryState():系统\电池\状态?{ val batterySt
fun main(){getBatteryState()}
fun getBatteryState():系统\电池\状态?{
val batteryState=系统电池状态()
val retrieveValue=powrpof.CallNtPowerInformation(
5.
指针.NULL,
0,
batteryState,
batteryState.size().toLong()
)
如果(retrieveValue==0)batteryState else为空,则返回
}
接口:StdCallLibrary{
@抑制(“函数名”)
fun CallNtPowerInformation(信息级别:Int,inBuffer:Pointer?,inBufferLen:Long,突发:系统电池状态?,突发:Long):Int
伴随对象:powrpof by Native.load(“powrpof”,powrpof::class.java)!!
}
类系统\电池\状态:结构(对齐\ MSVC),结构.ByReference{
变量AcOnLine:Byte=0
var BATTERYPRENT:字节=0
var充电:字节=0
变量:字节=0
var Spare1_0:字节=0
var Spare1_1:字节=0
var Spare1_2:字节=0
var Spare1_3:字节=0
var最大容量=0
var剩余容量=0
风险值率=0
var EstimatedTime=0
var DefaultAlert1=0
var DefaultAlert2=0
覆盖getFieldOrder():列表{
返回列表(
“AcOnLine”、“BatteryPresent”、“充电”、“放电”,
“Spare1_0”、“Spare1_1”、“Spare1_2”、“Spare1_3”,
“最大容量”、“剩余容量”、“速率”,
“估计时间”、“DefaultAlert1”、“DefaultAlert2”
)
}
}
线程“main”java.lang.Error中的异常:com.animeshz.github.batteryinfo.SYSTEM_BATTERY_STATE上的Structure.getFieldOrder()返回名称([AcOnLine、BatteryPresent、Charging、DefaultAlert1、DefaultAlert2、Discharging、EstimatedTime、MaxCapacity、Rate、RemainingCapacity、Spare1_0、Spare1_2、Spare1_3])与声明的字段名([])不匹配的
位于com.sun.jna.Structure.getFields(Structure.java:1089)
位于com.sun.jna.Structure.deriveLayout(Structure.java:1232)
位于com.sun.jna.Structure.calculateSize(Structure.java:1159)
位于com.sun.jna.Structure.calculateSize(Structure.java:1111)
位于com.sun.jna.Structure.allocateMemory(Structure.java:414)
位于com.sun.jna.Structure.(Structure.java:205)
位于com.sun.jna.Structure.(Structure.java:193)
位于com.sun.jna.Structure.(Structure.java:180)
在com.animeshz.github.batteryinfo.SYSTEM\u BATTERY\u STATE.(SYSTEM\u BATTERY\u STATE.kt:9)
在com.animeshz.github.batteryinfo.UtilKt.getBatteryState(util.kt:11)上
位于com.animeshz.github.batteryinfo.UtilKt.main(util.kt:60)
位于com.animeshz.github.batteryinfo.UtilKt.main(util.kt)
为什么声明的字段名显示为空数组/列表?我如何解决这个问题呢?JNA的
结构
类使用反射来查找字段名,这意味着它们必须声明为公共
字段/属性。根据需要删除getter并公开这些属性。我想这对你应该有用(未经测试):
JNA使用反射从结构中获取字段名,因此它们必须声明为
public
@DanielWiddis默认情况下,kotlin中的所有字段都是公共的,使用public标记(刚刚尝试过)没有任何效果:(因此,这是一个评论,而不是答案!没有其他想法,你在Kotlin中还有其他工作结构的例子吗?@DanielWiddis,我试图将SYSTEM_BATTERY_状态反编译为java,看起来属性是私有的,但它们的getter和setter是公共的,有没有方法指示结构调用setter/getter,或者它们“需要”用于公共场合(我认为kotlin不允许)?太好了,我会尝试将其转化为一个答案
class SYSTEM_BATTERY_STATE(
@JvmField var AcOnLine: Byte = 0,
@JvmField var BatteryPresent: Byte = 0,
@JvmField var Charging: Byte = 0,
@JvmField var Discharging: Byte = 0,
@JvmField var Spare1_0: Byte = 0,
@JvmField var Spare1_1: Byte = 0,
@JvmField var Spare1_2: Byte = 0,
@JvmField var Spare1_3: Byte = 0,
@JvmField var MaxCapacity = 0,
@JvmField var RemainingCapacity = 0,
@JvmField var Rate = 0,
@JvmField var EstimatedTime = 0,
@JvmField var DefaultAlert1 = 0,
@JvmField var DefaultAlert2 = 0
) : Structure(ALIGN_MSVC), Structure.ByReference {
override fun getFieldOrder() = listOf(
"AcOnLine", "BatteryPresent", "Charging", "Discharging",
"Spare1_0", "Spare1_1", "Spare1_2", "Spare1_3",
"MaxCapacity", "RemainingCapacity", "Rate",
"EstimatedTime", "DefaultAlert1", "DefaultAlert2"
)
}