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; }