Pretendo gerar uma DLL de um código C, para ser usada via JNA. Minhas principais dúvidas são as seguintes:
Quais são os requisitos para gerar uma DLL? Tenho que ter o .h que será o cabeçalho da DLL, certo?
Esta minha DLL depende de uma pancada de outras DLL´s. Para usá-la todas as outras devem estar no mesmo diretório, certo?
Saberiam me dizer o comando no gcc para gerar a DLL e se possível dar uma explicada básica (Já vi e tentei tanta coisa que estou para lá de confuso )
Agradeço toda e qualquer ajuda. Obrigado. [/quote]
Seu principal pré-requisito é saber o mínimo de C para poder criar uma DLL.
Você precisa fazer o seguinte:
a) Definir que métodos deverão ser exportados por essa DLL
b) Criar uma classe Java e compilá-la com os métodos estáticos correspondentes aos métodos exportados pela DLL
c) Chamar a ferramenta javah, que gera o .h para usar com JNI
d) Escrever o código C com base nesse .h
As outras DLLs devem estar no path (não no classpath) do Windows.
Boa pergunta; eu sei que funciona com o Microsoft Visual C++, mas nunca tentei com o gcc (na verdade deve haver um herói que conseguiu isso , mas eu mesmo não tenho a menor idéia do que deve funcionar)
O Java no Windows é compilado com o Microsoft Visual C++ 2005; tente usar o Microsoft Visual Studio Express / C++.
Uma outra forma, que é um pouco mais simples, é criar uma DLL mais simples que possa ser chamada via JNA. Mesmo isso não é tão trivial assim.
Sim, pretendo usar JNA mesmo. JNI só em último caso. Já tenho o arquivo .c com as funções que preciso utilizar. Para gerar essa DLL mais “simples” teria que escrever somente o .h com as funções que serão exportadas? Bastaria isso?
Para usar JNA, se não me engano, basta você saber mapear entre os métodos exportados por sua DLL e os que você definiu no JNA. Eu infelizmente nunca usei o JNA para lhe dizer exatamente o que você pode e o que você não pode usar na sua DLL.
Cara, eu já tive que fazer isso em um projeto aonde a aplicação tinha que se comunicar com o modem do cliente. Logo de cara, foram necessario 2 bibliotecas, uma para linux (.SO) e outra para Windows (.DLL).
Para facilitar o trabalho eu fiz o seguinte, criei minha DLL normalmente, então, criei uma outra DLL que funcionava como uma Facade, ou seja, o Java conseguia conversar com ela e ela tinha as chamadas para a DLL.
Vamos por partes, para o Java conseguir chamar a DLL ou SO, ela deve atender algumas especificações, que podem ser obtidas atravez o comando javah. Este comando varre as classes e gera um .h (header do C/C++) com o protótipo das funções que foram marcadas com o modificador “native”.
Com este .h em mãos, coloque na pasta do projeto facade e implemente exatamente os metódos exportados. Adicione a esta DLL a referencia a DLL que vc deseja chamar e coloque as chamadas do Java chamando a DLL alvo.
Para compilar no gcc, tem uma flag -shared, mas só isso não é o suficiente e não recomendo o uso do gcc no windows, já que para usa-lo é necessário instalar ou o cygwin ou o MinGW, ambos com um ou outro probleminha para rodar no windows.
Sim, pelo que li seria exatamente isto, simplificando bastante se comparado a JNI.
[quote]Cara, eu já tive que fazer isso em um projeto aonde a aplicação tinha que se comunicar com o modem do cliente. Logo de cara, foram necessario 2 bibliotecas, uma para linux (.SO) e outra para Windows (.DLL).
Para facilitar o trabalho eu fiz o seguinte, criei minha DLL normalmente, então, criei uma outra DLL que funcionava como uma Facade, ou seja, o Java conseguia conversar com ela e ela tinha as chamadas para a DLL.
Vamos por partes, para o Java conseguir chamar a DLL ou SO, ela deve atender algumas especificações, que podem ser obtidas atravez o comando javah. Este comando varre as classes e gera um .h (header do C/C++) com o protótipo das funções que foram marcadas com o modificador “native”.
Com este .h em mãos, coloque na pasta do projeto facade e implemente exatamente os metódos exportados. Adicione a esta DLL a referencia a DLL que vc deseja chamar e coloque as chamadas do Java chamando a DLL alvo.
Para compilar no gcc, tem uma flag -shared, mas só isso não é o suficiente e não recomendo o uso do gcc no windows, já que para usa-lo é necessário instalar ou o cygwin ou o MinGW, ambos com um ou outro probleminha para rodar no windows. [/quote]
Cara muito boa sua explicação. Embora eu só venha a usar JNI em último caso, sua explicação deu uma ótima visão geral do assunto.
Ahhh, na minha “época” não tinha essa mordomia!
Cara, então, eu acho que é só compilar a criança e mandar vê! Foi bom vc ter falado sobre JNA, eu nem sabia que isso existia. Se eu puder usar meus códigos Java junto com os C/C++ sem passar pelo JNI vai ficar bem bacana.
Obrigado pela luz!