Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Kotlin JNA正在将声明的字段名设置为空列表_Java_Kotlin_Struct_Jna - Fatal编程技术网

Java Kotlin JNA正在将声明的字段名设置为空列表

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

下面的代码深受和的启发,我正试图让它使用Kotlin语言,而不是答案中给出的Java

它基本上基于JNA(Java Native Access),它从Windows本机库(在C++上)中提取有关笔记本电脑电池的信息

这段代码在Java版本中可以正常工作,但如果我尝试对Kotlin执行同样的操作,我会得到一个异常,即声明的字段名是一个空列表/数组

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"
        )
}