Kotlin:创建并引用真正的Java数组(对于JNA)

我想用Kotlin来使用JNA,而且我遇到了一个问题。 Caused by: java.lang.IllegalArgumentException: class [Lcom.sun.jna.platform.win32.WinDef$HMODULE; is not a supported argument type (in method EnumProcessModulesEx in class kotmem.unsafe.Psapi)

我的Psapi直接映射对象:

 package kotmem.unsafe import com.sun.jna.* import com.sun.jna.platform.win32.* import com.sun.jna.ptr.* object Psapi { // note Array<WinDef.HMODULE?> external fun EnumProcessModulesEx(process: Pointer, modules: Array<WinDef.HMODULE?>, cb: Int, neededModules: IntByReference, flags: Int): Boolean external fun GetModuleInformation(process: Pointer, module: WinDef.HMODULE, moduleInfo: LPMODULEINFO, cb: Int): Boolean external fun GetModuleBaseNameA(process: Pointer, module: WinDef.HMODULE, fileName: ByteArray, size: Int): Int init { Native.register(NativeLibrary.getInstance("Psapi")) } } 

这个问题似乎在我打电话的方式。 JNA不喜欢Kotlin的Array类,因为它不知道如何映射。 有没有办法引用真正的Java数组,以便JNA可以映射这个函数? 另外,有没有办法构建这样的?

这就是我称之为的方式:

 fun modulesOfProcess(process: UnsafeProcess): List<UnsafeModule> { val list = emptyList<UnsafeModule>() val process = process.handle.pointer // note that I construct using arrayOfNulls val modules = arrayOfNulls<WinDef.HMODULE>(1024) val needed = IntByReference() Psapi.EnumProcessModulesEx(process, modules, modules.size, needed, 1) for (i in 0..needed.value / 4) { val module = modules[i] ?: continue val info = LPMODULEINFO() if (!Psapi.GetModuleInformation(process, module, info, info.size())) list + UnsafeModule(module, info) } return list } 

直接映射不支持Pointer阵列或NativeMapped数组( 请参阅文档 )。

您可以手动构建一个指针缓冲区并传递:

 Pointer modules = new Memory(Pointer.SIZE * length); int offset = 0; for (h: hmodules) { modules.setPointer(Pointer.SIZE * offset, h.getPointer()) offset += 1; }