gpt4 book ai didi

java - JNA什么时候创建FromNativeContext? (成吨的垃圾)

转载 作者:行者123 更新时间:2023-12-01 11:14:21 25 4
gpt4 key购买 nike

JNA 何时创建 FromNativeContext 以及如何阻止创建这些对象?我通过我的应用程序在几秒钟内创造了数百万美元。我正在使用这个直接映射的类:

public final class Kernel32Direct {

public static native boolean WriteProcessMemory(Pointer process, long address, Memory memory, int size, int written);

public static native boolean ReadProcessMemory(Pointer process, long address, Memory memory, int size, int written);

public static native Pointer OpenProcess(int desired, boolean inherit, int pid);

public static native WinNT.HANDLE CreateToolhelp32Snapshot(WinDef.DWORD var1, WinDef.DWORD var2);

public static native boolean Process32Next(WinNT.HANDLE var1, Tlhelp32.PROCESSENTRY32 var2);

public static native boolean CloseHandle(WinNT.HANDLE var1);

static {
Native.register(NativeLibrary.getInstance("Kernel32", W32APIOptions.UNICODE_OPTIONS));
}

}

最佳答案

当 JNA 必须将原始值转换为 Java 对象时,就会创建 FromNativeContext 对象。

避免使用非原始类型。当您使用从 NativeMapped 派生的类型时(即 HANDLE,它是 PointerType,以及 DWORD,它是 IntegerType),将 Java 对象转换为原始整数或指针会产生额外的开销。

使用int而不是DWORD,并使用Pointer而不是HANDLE

您可能还会对 boolean 参数(在 W32APIOptions.DEFAULT_OPTIONS 中定义)进行一些类型转换。只需使用 int 代替 boolean 输入,或者省略类型映射器(JNA 应该能够将“int”返回值转换为 Java boolean 值,而无需显式类型映射器)。

您还应该使用 Pointer 作为参数类型,而不是 Memory,但这主要与样式有关。

关于java - JNA什么时候创建FromNativeContext? (成吨的垃圾),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32002825/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com