Kotlin: crea y refiere matrices de Java verdaderas (para JNA)

Intento usar JNA con Kotlin y me encontré con un problema. 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)

Mi object Psapi directo:

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

El problema parece estar en la forma en que lo estoy llamando. A JNA no le gusta la class Array de Kotlin que asumo porque no sabe cómo mapearla. ¿Hay alguna manera de referirse a las matrices de Java reales para que JNA pueda asignar esta function? Además, ¿hay alguna manera de build tal?

Esta es la forma en que lo llamo:

 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 } 

Solutions Collecting From Web of "Kotlin: crea y refiere matrices de Java verdaderas (para JNA)"

La asignación directa no admite matrices de Pointer o matrices de NativeMapped ( ver documentos ).

Puedes build manualmente un buffer de pointers y pasar eso:

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