пытаясь создать dll "Hello Word" в Visual Studio, которую будет принимать Java Native Access - PullRequest
3 голосов
/ 11 марта 2010

Я успешно скомпилировал свою библиотеку на Linux и Mac и использовал ее с Java Native Access. К сожалению, ничего, что я делаю, похоже, не работает с компилятором Visual Studio и Java Native Access.

Я возвращаюсь к основам и пытаюсь создать в Visual Studio супер простой dll, с которым будет работать Java Native Access, любая помощь будет оценена.

Вот GimmeFiveDll.c:

__declspec(dllexport) int gimmeFive()
{
    return 5;
}

Вот SystemLibrary.java:

import com.sun.jna.Native;


public class SystemLibrary {

public static final SystemLibrary instance = new SystemLibrary();

    static {
        Native.register("GimmeFiveDll");
    }

    public native int gimmeFive();
}

Я уже пытался переключить интерфейс вызова на стандартный вызов в Visual Studio. Я не вносил никаких других изменений из настроек по умолчанию в пустой проект dll win32 консоли мастера нового проекта. В приведенном выше примере полученный dll даже неправильно экспортирует функцию в соответствии с dumpbin.exe /exports. Мой реальный проект экспортирует их правильно, но в любом случае я всегда получаю одно и то же исключение JNA:

Exception in thread "main" java.lang.UnsatisfiedLinkError: Unable to load library 'GimmeFiveDll': The specified module could not be found.

(Да, я поместил GimmeFiveDll.dll в System32. Да, я могу использовать JNA для доступа к другим библиотекам в System32, которые поставляются с Windows).

Кто-нибудь хочет помочь мне завершить этот минималистский пример библиотеки DLL, созданной Visual Studio, которая нравится JNA?

Большое спасибо.

1 Ответ

5 голосов
/ 12 марта 2010

После двух дней удара головой о стену я понял это. Проблема заключалась в том, что C: \ Windows \ System32 НЕ является каталогом, который System.loadLibrary () (который использует Native.register ()) может загружать из dll на 64-битной машине! Таким образом, вместо этого JNA, очевидно, пытался скопировать библиотеку во временную папку и загрузить ее, но это не удалось. Сообщение «указанный модуль не найден» не очень помогло и неправильно указало мне: - \

В любом случае, чтобы ответить на мой собственный вопрос, вот пример библиотеки dll, которую можно построить с помощью MSVC, которую может использовать Java (и JNA) (просто поместите ее в правильный каталог для вашей системы!):

GimmeFiveDll.c:

#ifdef __cplusplus
#error no C++, to keep this example simple
#endif

__declspec(dllexport) int gimmeFive()
{
    return 5;
}

DllTest.java:

import com.sun.jna.Native;

public class DllTest {

    static {
        Native.register("GimmeFiveDll");
    }

    public static native int gimmeFive();

    public static void main(String[] args) {
        System.out.println("I got: " + DllTest.gimmeFive());
    }
}

Если все пойдет хорошо, Java напечатает «Я получил: 5».

Обратите внимание, что я не счел необходимым изменять настройки компилятора для использования stdcall или для объявления __stdcall в сигнатуре функции. На самом деле никаких изменений компилятора не требовалось из обычного пустого проекта dll, созданного мастером.

...