Windows API с использованием JNA: указанная процедура не может быть найдена
Мне нужно использовать функцию RegLoadKey в моем коде Java с помощью JNA, но я получаю следующее сообщение об ошибке:
Исключение в потоке "main" java.lang.UnsatisfiedLinkError: Ошибка при поиске функции RegLoadKey: указанная процедура не найдена. Blockquote
RegLoadKey синтаксис
LONG WINAPI RegLoadKey(
_In_ HKEY hKey,
_In_opt_ LPCTSTR lpSubKey,
_In_ LPCTSTR lpFile
);
мой код: Advapi32.java
import com.sun.jna.platform.win32.WinReg.HKEY;
import com.sun.jna.win32.StdCallLibrary;
public interface Advapi32 extends StdCallLibrary
{
long RegLoadKey(HKEY hKey, String lpSubKey,String lpFile);
}
apiTest.java
import com.sun.jna.*;
import com.sun.jna.platform.win32.WinReg.HKEY;
public class apiTest
{
public static void main (String [] args)
{
Advapi32 lib2 = (Advapi32) Native.loadLibrary("Advapi32", Advapi32.class);
HKEY key1 = new HKEY();
String filePath = "C:\\tmp\\software";
String regName = "loadedRegKey";
long test = lib2.RegLoadKey(key1, regName, filePath);
}
Я думаю, что есть несколько проблем с моим кодом. Я новичок в Windows API и JNA.
3 ответа
Знаете ли вы, что инкапсуляция Advapi32 уже является частью JNA? Посмотрите здесь. Я только что видел, что ваш метод RegLoadKey
там еще не добавлено. Так что добавьте это и отправьте это изменение ребятам JNA. После этого вы можете использовать его следующим образом (псевдокод):
public class RegistryRead{
private Advapi32 api = null;
public RegistryRead(){
this.api = Advapi32.INSTANCE;
}
public void read() {
long winapi = this.api.RegLoadKey(HKEY hkey, String subkey, String file);
...
}
}
Если вы посмотрите на Advapi32
отображение библиотеки , поставляемое с JNA, вы увидите, что создание экземпляра библиотеки включает в себя некоторые параметры метода загрузки. Среди прочего, эти параметры загрузки автоматически отображают такие вещи, как RegLoadKey
в RegLoadKeyW
, которое является настоящим именем функции, на которую вы пытаетесь связать.
Это типичная ошибка разработки JNA. Просто добавьте, прежде чем использовать его.
System.setProperty("jna.library.path","PATH_TO_LIBRARY_JNA");
PATH_TO_LIBRARY_JNA - абсолютный путь к jna lib