| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/04/2008 15:52:04
|
fabriciocarraro
Entusiasta Java
Membro desde: 28/04/2008 12:58:44
Mensagens: 17
Offline
|
Fala pessoal,
Li bastante coisa aqui no fórum e na internet, mas não to entendendo aonde está dando errado.
Eu preciso criar um programa em Java que carregue uma .dll de uma câmera digital (criada em C++), e use uma função dela, chamada InicializaSDK, e estou usando JNI pra isso.
Tentei criar uma wrapper para carregar, mas tá dando um erro... aí vai o que eu tentei fazer:
1- Primeiro criei o...
...Inicia.java:
2- Depois, compilei com o javac e usei o javah pra criar o...
...Inicia.h:
3- Então, escrevi o arquivo...
...Inicia.cpp:
E daí quando tento usar o "gcc -shared Inicia.cpp -o CDSDK.dll" ele dá erro.
Alguém sabe onde eu estou errando, ou o quê eu devo fazer?
Valeu, abração!
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/04/2008 15:55:20
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
Eu não queria ser chato, mas você tem como usar o Microsoft Visual Studio 2003 ou 2005? É que não sei se é possível escrever uma DLL JNI com o mingw (gcc para Windows).
|
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/04/2008 15:57:46
|
fabriciocarraro
Entusiasta Java
Membro desde: 28/04/2008 12:58:44
Mensagens: 17
Offline
|
Teria sim! Ou com o DevC++ também.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/04/2008 16:04:43
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
Eu vou postar aqui uma DLL JNI que fiz faz algum tempo com o MS VC++ 6.0. O 2003 ou 2005 são parecidos, você só precisa abrir uma linha de comando (No caso do Visual Studio 2005, Start -> Programs -> Microsoft Visual Studio 2005 -> Tools -> Visual Studio Tools -> Visual Studio 2005 Command Prompt, e ele abrirá uma linha de comando em que você pode usar o "cl" (compilador de linha de comando), "nmake", etc.
TESTEJNI.CPP
TESTEJNI.H
Use as opções de linha de comando especificadas no comentário do programa Java.
|
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/04/2008 19:26:00
|
fabriciocarraro
Entusiasta Java
Membro desde: 28/04/2008 12:58:44
Mensagens: 17
Offline
|
Thingol,
Valeu pela ajuda velho!
Mas então, a minha idéia era apenas chamar aquela função (void: void) já existente na CDSDK.dll (essa, uma .dll já existente também, instalada com o sw da câmera digital, provavelmente não foi criada usando os argumentos de JNI), e não preciso fazer nenhuma operação com essa função (pelo menos por enquanto não), só chamar sua execução.
E isso eu não captei ainda... e isso que me falaram de criar a wrapper.
Any idea?
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/04/2008 14:49:34
|
fabriciocarraro
Entusiasta Java
Membro desde: 28/04/2008 12:58:44
Mensagens: 17
Offline
|
Nada ainda aqui =/
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/04/2008 18:41:00
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
Pois é, eu postei algo que eu já tinha, só para lhe mostrar as opções de compilação.
|
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/04/2008 18:43:32
|
fabriciocarraro
Entusiasta Java
Membro desde: 28/04/2008 12:58:44
Mensagens: 17
Offline
|
Sim sim, essa parte de compilar eu "sei".
O que me falta é isso de acessar uma .dll já existente pra usar uma função dela.
Sabe alguma maneira Thingol?
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/04/2008 18:47:44
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
Você conhece suficientemente C? Basicamente você tem de chamar a tal função da DLL a partir da DLL JNI que você vai criar.
Se a tal DLL veio com um arquivo .H e um arquivo .LIB é fácil chamar o método InicializaSDK a partir de seu programa C.
Senão, você terá de chamar as APIs do Windows "LoadLibrary", "GetProcAddress", e "FreeLibrary".
|
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/04/2008 18:55:09
|
fabriciocarraro
Entusiasta Java
Membro desde: 28/04/2008 12:58:44
Mensagens: 17
Offline
|
Conheço o suficiente pra fazer isso sim acho.
E a DLL veio sim com .H e o .LIB, mas eu nunca manipulei .LIB, não sei como fazê-lo, e não sei como (ou se) devo "linkar" o arquivo DLL JNI com o DLL que contém a função.
O que eu consegui imaginar foi o que eu postei aqui mesmo, mas sei que meu arquivo .cpp está errado, e acho que é exatamente por não estar "linkando" com o DLL ou com o LIB que você disse.
To meio perdido nessa parte.
This message was edited 1 time. Last update was at 30/04/2008 18:57:13
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/04/2008 19:02:33
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
Então tá.
1) Crie uma classe Java com apenas um método estático (digamos que seja "public native void inicializaSdk();"), e talvez um método estático para carregar a DLL (System.loadLibrary ou System.load), e a compile.
2) Use o javap para criar o arquivo .h.
3) Crie um arquivo em C ou C++ que inclua o .h criado no passo 1, e que implemente o tal método que está definido no .h. Esse arquivo em C ou C++ deve incluir também o .h que define o tal método InicializeSDK do seu toolkit.
4) Compile esse arquivo em C ou C++ e o linke com
o tal .LIB que você recebeu. Isso irá gerar a tal DLL JNI.
|
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 05/05/2008 13:49:35
|
fabriciocarraro
Entusiasta Java
Membro desde: 28/04/2008 12:58:44
Mensagens: 17
Offline
|
Parte 1) Classe .java criada
Parte 2) Arquivo .h criado com o javah
Parte 3) Arquivo .cpp (essa parte eu não tenho certeza se está certa; eu copiei a implementação da função InicializaSDK() que estava no arquivo .cpp (o original, onde está a implementação dessa função) e coloquei em formato de JNI, mas não tenho certeza se é essa mesma a idéia. Acho que a intenção é acessar a InicializaSDK() direto da .dll ou da .lib que eu possuo, e não copiar sua implementação pra um novo .cpp, aí que eu estou me perdendo)
Parte 4) Compilei o projeto e linkei com a .LIB e a .A já existentes, assim criando a .dll, mas quando eu rodo (usando javac):
Eu estou errando no passo 3 mesmo? Eu tenho que fazer a chamada diretamente da minha .LIB ou da .DLL? Ou estou fazendo corretamente?
Abraço!
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/05/2008 09:01:14
|
fabriciocarraro
Entusiasta Java
Membro desde: 28/04/2008 12:58:44
Mensagens: 17
Offline
|
Opa!
Meu orientador disse que a idéia é só chamar a função InicializaSDK() mesmo, e não declarar tudo de novo.
Dessa forma o passo 3 ficaria:
Só que assim ele não compila, diz que 'InicializaSDK' undeclared (first use this function) =/
E ah Thingol, eu tenho a .DLL, a .LIB e a .A; a .H que eu tenho define alguns métodos do corpo da função InicializaSDK() (CDStartSDK() e CDFinishSDK() como visto no post anterior), mas não nenhum que defina a própria função que eu desejo.
Abraço!
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/05/2008 09:09:19
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
Hum...
Você está mostrando um arquivo .A. O que ele está fazendo aí?
Qual é o compilador que você está usando? Nunca vi ninguém dizendo que teve sucesso ao usar o mingw (gcc para Windows) para escrever DLLs JNI, por exemplo.
|
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/05/2008 09:16:17
|
fabriciocarraro
Entusiasta Java
Membro desde: 28/04/2008 12:58:44
Mensagens: 17
Offline
|
O .A eu coloquei junto como parâmetro apenas pq estava na mesma pasta que o .LIB, não sei se é correto fazer isso.
Estou criando a .DLL JNI com o DevC++ mesmo.
Pra linkar a .LIB e a .A eu cliquei em "Opções de Projeto", depois na aba "Parâmetros", e na janela "Linker" eu adicionei ambos e dei OK, só isso ehehehhe
|
|
|
 |
|
|