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

标签 java arrays jna kotlin psapi

我尝试将 JNA 与 Kotlin 结合使用,但遇到了问题。 引起:java.lang.IllegalArgumentException:类[Lcom.sun.jna.platform.win32.WinDef$HMODULE;不是受支持的参数类型(在类 kotmem.unsafe.Psapi 的方法 EnumProcessModulesEx 中)

我的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 数组 ( see docs )。

您可以手动构造指针缓冲区并传递它:

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

关于java - Kotlin:创建并引用真正的 Java 数组(用于 JNA),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33950973/

相关文章:

JavaFX TextArea 包含 String.split() 的空行?

java - 在 Java JNA 中向 Native Function 传递引用变量

shared-memory - shm_open 函数的正确 Java 映射是什么?

java - 如何使用 JNA 访问 Mac OS X 内核框架 (mach)

java - Spring RestTemplate GET 带参数

java - Java 中的@Override 注解

java - 对集合框架的动态类型转换效果

javascript - Javascript 中最长的公共(public)前缀

c++查找数组中数字的出现

java - 根据数组列表的值对数组的内容进行排序