2015-04-17 4 views
1

Я пытаюсь использовать ранее существовавшую DLL-файл stdcall в JNA, и одна из функций продолжает жаловаться на невозможность найти зависящую от времени выполнения dll. В эквивалентной версии JNI я не получаю эту жалобу, и она работает так, как ожидалось.JNA-зависимая библиотека не найдена

System.loadLibrary("MP300Com"); 

Map<String, Object> functionMapper = new HashMap<>(); 
functionMapper.put(
     Library.OPTION_FUNCTION_MAPPER, 
     new StdCallFunctionMapper()); 

library = (Mp300Library)Native.loadLibrary(
     "MP300Com", 
     Mp300Library.class, 
     functionMapper); 

 

public interface Mp300Library extends StdCallLibrary { 
    int USBEnumerateDevices(IntByReference pNbMP300, Pointer ppSerialList); 
} 

 

public static String[] USBEnumerateDevices() throws Mp300Exception { 
    Memory pSerialList = new Memory(512); 
    IntByReference pNbMP300 = new IntByReference(); 
    Pointer ppSerialList = new Memory(Pointer.SIZE); 
    ppSerialList.setPointer(0, pSerialList); 
    int status = library.USBEnumerateDevices(pNbMP300, ppSerialList); 
    System.out.println(status); // 65525 = 0xfff5 
    return null; 
} 

Когда я вызываю функцию USBEnumerateDevices я получаю возвращаемое значение 0xFFF5, которое в соответствии с инструкцией означает "не MPDeviceDriver.dll нашли"

Файл MPDeviceDriver.dll - это i n тот же путь, что и MP300Com.dll, и оба они также находятся в c: \ windows \ sysWOW64

Я также попытался добавить System.loadLibrary("MPDeviceDriver"); до и после другой загрузки, без успеха. Я могу проверить, что он загружается - по JNA, потому что я не могу удалить файл MPDeviceDriver.dll в папке проекта (он заблокирован).

Как говорилось ранее, когда версия JNI вызывает эту функцию, я получаю возвращаемое значение 0x0 (ok), и устройства перечислены правильно. Выдержка из кода JNI:

int nbMp = 0; 
char devlist[512]; 
char *pList = devlist; 
WORD ret = USBEnumerateDevices(&nbMp, &pList); 

С зависимости ходок, я не вижу каких-либо явно отсутствующие зависимости, и, кроме того, MPDeviceDriver.dll нет в списке, как зависимость. Я предполагаю, что он загружается вручную, по самому коду.

Я уверен, что способ вызова USBEnumerateDevices в JNA правильный, потому что, когда я заменяю MP300Com.dll на очень старую версию (не зависящую от MPDeviceDriver.dll), устройство получает нумерацию правильно. (pSerialList содержит мою строку устройства)

Link to the function definition in the manual

ответ

1

После коллега попробовал некоторые упрощенные тесты внезапно работали, и после того, как я попытался перевести точный порядок вызовов в рамках, он снова не работает , Оказывается, эта специфическая DLL является поточно-чувствительным, а в наиболее скрученной образом:

  • Если нить загрузки DLL и поток, используя DLL для в первый раз одинаковы, то DLL работает в все темы.
  • Если поток, загружающий DLL и поток с использованием DLL в первый раз, отличается, ни один из этих потоков не может использовать DLL, но другой поток, порожденный из другой ThreadGroup, может использовать DLL.
Смежные вопросы