Fiz uns testes básicos com o JNA e achei fantástico pela facilidade. Terei de usar o JNA para acessar uma DLL para a parte de áudio de um softphone. Por exemplo terei de escrever em uma interface que extende Library a assinatura dos métodos que eu utilizarei, porém se esses métodos usam outros métodos, terei de escrever a assinatura desses métodos que eu uso “indiretamente”? Sei que essa DLL utiliza algumas outras DLL. E se os métodos que eu utilizarei precisarem de um método de outra DLL?
Fiz uns testes básicos com o JNA e achei fantástico pela facilidade. Terei de usar o JNA para acessar uma DLL para a parte de áudio de um softphone. Por exemplo terei de escrever em uma interface que extende Library a assinatura dos métodos que eu utilizarei, porém se esses métodos usam outros métodos, terei de escrever a assinatura desses métodos que eu uso “indiretamente”? Sei que essa DLL utiliza algumas outras DLL. E se os métodos que eu utilizarei precisarem de um método de outra DLL?
Desde já agradeço!!!
Procure usar o dependency walker do windows para ver a árvore de dependências de uma DLL.
Não tenho certeza se, caso falte alguma DLL, só vai dar erro na hora de invocar alguma função da DLL faltante ou se vai dar erro na hora de carregar a DLL que depende da DLL faltante.
Inté.
T
thingol
Digamos que você tenha uma DLL X.DLL que você referenciou via JNA, e essa DLL X.DLL depende explicitamente das dlls Y.DLL e Z.DLL (conforme você viu com a ferramenta Depends.exe (também conhecida por “Dependency Walker” e que pode ser obtida no Microsoft Visual Studio), e implicitamente da DLL W.DLL (que a DLL X.DLL carregou usando a API “LoadLibrary”):
Você só precisa referenciar, via JNA, a DLL X.DLL.
Se Y.DLL for referenciada por X.DLL sem “delay loading” (isso pode ser visto usando-se o Dependency Walker), então a omissão de Y.DLL irá se refletir imediatamente durante o carregamento de X.DLL.
Se Z.DLL for referenciada por X.DLL com “delay loading”, então a omissão de Z.DLL irá se refletir apenas quando X.DLL precisa chamar algum método de Z.DLL.
Se W.DLL for referenciada por X.DLL apenas via LoadLibrary, então a omissão de W.DLL pode se refletir quando X.DLL precisar chamar algum método de W.DLL e descobrir que a DLL não foi encontrada, mas pode até ser que W.DLL consiga simplesmente entrar em um modo de “graceful degradation”, ou seja, X.DLL não executa todas as funcionalidades mas apenas um subconjunto delas que não depende de W.DLL.