2015-08-14 1 views
0

Когда JNA создает FromNativeContext и как я могу предотвратить создание этих объектов? Через несколько секунд я создаю миллионы в своем приложении. Я использую этот прямой отображенный класс:Когда 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)); 
    } 

} 

ответ

1

FromNativeContext объекта создается, когда ЮНА должна преобразовать примитивное значение в объект Java.

Избегайте использования непримиримых типов. Когда вы используете тип, который происходит от NativeMapped (т. Е. , который является PointerType и DWORD, который является IntegerType), вы получаете дополнительные накладные расходы для преобразования из объекта Java в примитивное целое или указатель.

Используйте int вместо DWORD и используйте Pointer, а не HANDLE.

Возможно, вы также получаете преобразование определенного типа на параметр boolean (определенный в W32APIOptions.DEFAULT_OPTIONS). Просто используйте int вместо булевского ввода или оставьте тип mapper (JNA должна иметь возможность преобразовать возвращаемое значение «int» в Java boolean без явного типа mapper).

Вы должны также использовать Pointer как тип параметра, а не Memory, но это в основном о стиле.

Смежные вопросы