Jni

Fui fazer o teste aqui e também não consegui criar um programa usando jni.

Usei o google e achei dois links:

MinGW - Frequently Asked Questions
MinGW - JNI-Min GW-DLL

Depois disso se vc conseguir mostra aqui pra mim, pois o maldito proxy não deixa acessar o site (proxy FDP!!!)

flw

[quote=hashcode][quote=txithihausen][quote=hashcode]Tem que tacar as DLL no diretório padrão para o linker do SO achar o cara. Vai por mim.
Ah! troque

System.loadLibrary("libHelloNative.dll");

por

[code]

System.loadLibrary(“HelloNative”);
[/code][/quote]

Pode acreditar, eu já tentei tudo isso :x , já coloquei a dll na system32, já acrescentei a pasta da aplicação na PATH, já chamei loadLibrary(“libHelloNative.dll”) e loadLibrary(“libHelloNative”). O jeito é largar tudo é virar filósofo ou estudante de letras ou programador em BrainFuck :lol: !!
Eu ainda estou convencido que o problema é nas opções de compilação passadas ao gcc e não no código java, acho que está sendo criado apenas um código objeto em vez de uma biblioteca dinâmica, mas tentei -shared que seria a opção óbvia mas nada
continua…[/quote]
Pelo que entendi vc não tirou o lib da frente do nome.
Tem que ser assim

System.loadLibrary("HelloNative");

pelo menos no linux.

[/quote]

Testado e continua a dar erro!!

[quote=dudaskank]Fui fazer o teste aqui e também não consegui criar um programa usando jni.

Usei o google e achei dois links:

MinGW - Frequently Asked Questions
MinGW - JNI-Min GW-DLL

Depois disso se vc conseguir mostra aqui pra mim, pois o maldito proxy não deixa acessar o site (proxy FDP!!!)

flw
[/quote]

No site http://www.mingw.org/MinGWiki/index.php/JNI-MinGW-DLLé utilizada esta forma para :

C:\Documents and Settings\Ivo Augusto\Desktop\JNI>gcc -Wall -D_JNI_IMPLEMENTATIO
N_ -Wl, --kill-at -I "C:\Arquivos de programas\Java\jdk1.5.0_04\include" -I "C:\
Arquivos de programas\Java\jdk1.5.0_04\include\win32" -shared -o libHelloNative.
dll HelloNative.c

Porém não é encontrada a opção --kill-at, olha a saída do compilador:

cc1.exe: error: unrecognized command line option "-fkill-at"

Tentei tirar a opção --kill-at, ele compila, mas gera o seguinte erro na hora de utiliza-lo

C:\Documents and Settings\Ivo Augusto\Desktop\JNI>java HelloNativeTest
Exception in thread "main" java.lang.UnsatisfiedLinkError: greeting
        at HelloNative.greeting(Native Method)
        at HelloNativeTest.main(HelloNativeTest.java:3)

Eu ainda vou ver se encontro uma saída neste site, foi onde achei material mais promissor. Quanto ao outro site, ainda não tive tempo de dar uma olhada para ver se funciona, quando eu ver posto aqui a resposta
Eu ainda venço a guerra contra o JNI
:lol:

Finalmente consegui!!! venci a batalha :lol: :lol: !!
A resposta estava no site http://www.mingw.org/MinGWiki/index.php/JNI-MinGW-DLL mesmo

para compilar a dll eu usei mesmo:

gcc -I"C:\Arquivos de programas\Java\jdk1.5.0_04\include"
-I"C:\Arquivos de programas\Java\jdk1.5.0_04\include\win32"
-Wall -D_JNI_IMPLEMENTATION_ -Wl,--kill-at -shared -o
libHelloNative.dll HelloNative.c

estava dando problema porque eu estava separando depois da virgula

-Wl,--kill-at

porém faz parte de uma única opção de compilação!
Só para complementar, não foi necessário eu colocar a dll na system32 não do próprio diretório funcionou. vlw pela ajuda de todos
flw :roll:

[quote=txithihausen]Finalmente consegui!!! venci a batalha :lol: :lol: !!
A resposta estava no site http://www.mingw.org/MinGWiki/index.php/JNI-MinGW-DLL mesmo

para compilar a dll eu usei mesmo:

gcc -I"C:\Arquivos de programas\Java\jdk1.5.0_04\include"
-I"C:\Arquivos de programas\Java\jdk1.5.0_04\include\win32"
-Wall -D_JNI_IMPLEMENTATION_ -Wl,--kill-at -shared -o
libHelloNative.dll HelloNative.c

estava dando problema porque eu estava separando depois da virgula

-Wl,--kill-at

porém faz parte de uma única opção de compilação!
Só para complementar, não foi necessário eu colocar a dll na system32 não do próprio diretório funcionou. vlw pela ajuda de todos
flw :roll:[/quote]

De volta aos problemas. Essa solução que eu encontrei para criar dll não funciona para o caso de criar .so para linux a opção -Wl,–kill-at não foi encontrada. Eu dei uma pesquisada no google e achei esta página em cache:
http://64.233.161.104/search?q=cache:NcyVNXLlxGoJ:quong.
best.vwh.net/java/native102.html+Creating+a+JNI+so+with+gcc+%2B+
linux&hl=pt-BR&gl=br&ct=clnk&cd=10

ela recomenda utilizar a opção -Wl,-soname, mas não está funcionando. Ainda estou na busca de criar uma lib para o linux. Se alguém souber como se faz isso, ajuda seria muito bem-vinda

Bom, achei esse endereço no google que parece interessante também, vê se ajuda:

Unix JNI How-To

flw

Finalmente consegui criar as dll e libs tanto para linux quanto para windows:
vou colocar abaixo o que fiz para quem estiver interessado em JNI não precisar quebrar a cabeça como eu: :lol:

em windows:

gcc -I"C:\Arquivos de programas\Java\jdk1.5.0_04\include"
-I"C:\Arquivos de programas\Java\jdk1.5.0_04\include\win32"
-Wall -D_JNI_IMPLEMENTATION_ -Wl,--kill-at -shared -o
libHelloNative.dll HelloNative.c

java HelloNativeTest

em linux:

gcc -I /usr/jdk1.5.0_05/include/ -I /usr/jdk1.5.0_05/include/linux/ -c HelloNative.c -o HelloNative.o

ld -shared  HelloNative.o -o libHelloNative.so

java -Djava.library.path=<diretório da lib> HelloNativeTest

na chamada
em windows
a chamada é dada por System.loadLibrary(“libHelloNative”);
para uma dll chamada libHelloNative.dll

e em linux usa-se:
System.loadLibrary(“HelloNative”);
para lib chamada : libHelloNative.so

[quote=txithihausen]@kubanacan
Realmente!!! o problema é que não posso usar esses compiladores :x !! pois o projeto que estou fazendo é opensource!![/quote]

Você pode tentar o MinGW que é um gcc para Windows:

http://www.mingw.org/

Aí você usa o seguinte comando para gerar as DLLs:

gcc -Wl,--kill-at, -I"%JAVA_HOME%\include" -I"%JAVA_HOME%\include\win32" -shared sua_lib.c -o sua_lib.dll

t+

[quote=bobmoe][quote=txithihausen]@kubanacan
Realmente!!! o problema é que não posso usar esses compiladores :x !! pois o projeto que estou fazendo é opensource!![/quote]

Você pode tentar o MinGW que é um gcc para Windows:

http://www.mingw.org/

Aí você usa o seguinte comando para gerar as DLLs:

gcc -Wl,--kill-at, -I"%JAVA_HOME%\include" -I"%JAVA_HOME%\include\win32" -shared sua_lib.c -o sua_lib.dll

t+[/quote]
Eu já estou usando o gcc que vem com o DevC++, que usa o MinGw. Mas mesmo assim vlw.

flw