Что является самым простым способом вызова функции ядра Windows из Java?

Ответов: 3


7 принят

Если вы перейдете к JNA, подумайте о том, как использовать java- импорт . io . *; импорт com . солнце . jna . *; public class Ren { статический интерфейс Kernel32 расширяет библиотеку { public static Kernel32 INSTANCE = ( Kernel32 ) Native . loadLibrary ( "Kernel32" , Kernel32 . class ); public static int FORMAT_MESSAGE_FROM_SYSTEM = 4096 ; public static int FORMAT_MESSAGE_IGNORE_INSERTS = 512 ; public boolean MoveFileW ( WString lpExistingFileName , WString lpNewFileName ); public int GetLastError (); public int FormatMessageW ( int dwFlags , Pointer lpSource , int dwMessageId , int dwLanguageId , char [] lpBuffer , int nSize , Pointer Arguments ); } public static String getLastError () { int dwMessageId = Kernel32 . ИНСТАНЦИЯ . GetLastError (); char [] lpBuffer = новый char [ 1024 ]; int lenW = Kernel32 . ИНСТАНЦИЯ . FormatMessageW ( Kernel32 . FORMAT_MESSAGE_FROM_SYSTEM | Kernel32 . FORMAT_MESSAGE_IGNORE_INSERTS , нуль , dwMessageId , 0 , lpBuffer , lpBuffer . Длина , нуль ); return new String ( lpBuffer , 0 , lenW ); } public static void main ( String [] args ) throws IOException { String from = ". \ from.txt" ; String to = ". \ to.txt" ; новый FileOutputStream ( from ). close (); if (! Kernel32 . INSTANCE . MoveFileW ( новый WString ( from ), новый WString ( to ))) { throw new IOException ( getLastError ()); } } } - это избавляет от необходимости предоставлять информацию о конфигурации для выбора между вызовами Unicode и ANSI.

MoveFileA

EDIT: я отредактировал свой ответ после проверки кода - я ошибся в использовании char [] в сигнатуре - лучше использовать WString .


1

Если это действительно необходимо (renameTo не работает, и вы уверены, что MoveFile будет), я бы использовал JNA . Похоже, что большая часть работы уже выполнена в com.mucommander.file.util. Kernel32.java / Kernel32API.java .


1

Основываясь на библиотеке NativeCall, я сделал следующее приложение POC .

Он использует MoveFileAфункцию из kernel32.dll

Он поставляется как полный рабочий образец с run.bat и всеми банками и dll на месте.

Он перемещает включенный test.txt в test2.txt


Если вам не нравится версия библиотеки NativeCall, я сделал еще одно приложение POC на основе / resuing в библиотеке Java Native Access (JNA) . На этот раз MoveFileWи MoveFileWреализованы и продемонстрированы.

java, windows, winapi, jni, jna,
Похожие вопросы
Яндекс.Метрика