Utilizar programas em C com Java

Olá Pessoal…

Preciso utilizar alguns programas que estão na linguagem C. Eles são rotinas, que recebem um determinado parâmetro, e retornam outro.

Teria como eu fazer chamadas a essas rotinas através do Java,
sem que eu tenha que alterar o código do programa em C.

Alguém teria algum exemplo??? se possível…

Obrigado…

Eu não tenho um exemplo… mas vc terá que utilizar JNI…

Esse link tem um exemplo e explicações sobre o JNI

http://java.sun.com/developer/onlineTraining/Programming/JDCBook/jni.html

No caso de utilzar o JNI, eu além de criar os métodos nativos necessários em Java, precisarei também modificar o programa em C ??? É que os programas em C não são meus, são de terceiros, e não tenho autoridade para modifica-los…

Sim você terá que fazer alterações …
de uma olhada no tutorial da sun … la tem um exemplo disso …

Foi o que eu pensei…

Mas nesse caso então eu não vou poder utilizar JNI, devido ao prazo para a entrega do projeto, e de não poder modificar o código em C…

No caso não existe uma outra forma de fazer este acesso, sem ter
que tocar no código fonte do programa em C ???

Obrigado…

Oi amigo, eu já mexi muito com JNI.Já implementei centenas de linhas em C para depois usar no Java.Antes eu achava q poderia ganhar performance usando código em C.Mas depois de testar muito contra o desempenho de VM?s mais novas como o j2se1.4.2 eu cheguei à conclusão de q ñ vale tão a pena usar código em C no Java.
O desempenho do Java está absurdamente alto.Pra vc ter uma idéia, devido ao fato de a VM ter um compilador C em tempo de execução, um programa compilado em tempo real tem a oportunidade valiosa de ser otimizado para a arquitetura do hardware.A VM 1.4.2_03 ,por exemplo, tem a opção de usar instruções SSE (Pentium3) e SSE2(pentium4) q permitem operações de ponto flutuante quase 2X mais rápidas q o normal.Esse recurso é implementado em compiladores C como o gcc, mas usá-los no C é dar uma facada no desempenho em qualquer outra arquitetura q ñ seja P3 ou P4.Pra vc ter uma idéia, se vc otimizar para Pentium 3 seu código em C, ele vai rodar lento até mesmo em P4( de 1,75 à 3X mais lento) mas se rodar em P3 vai ficar muito rápido.O Java no modo (-server) tem a mesma performance do gcc com os flags ?march=pentium4 ?mfpmath=sse ?msse2.
Mas já q vc quer usar código em C, eu vou pelo menos lhe dar uma idéia de como é q funciona.
Vc tem q declarar uma função sem corpo com o modificador ?native? no Java.Aí vc usa uma ferramenta do j2sdk chamada javah.exe q vai gerar um header associado à função q vc quer importar do C. Depois vc vai escrever um código em C q inclui esse header e vai implementar a função associada ao Java com uma convenção de chamada JNIEXPORT tipo:
JNIEXPORT void JNICALL Java_NomeDaClasse_NomeDoMetodo(JNIEnv env,jobject obj);
Esses dois últimos parâmetros são os q vão ser usados pela VM para chamar o método.
Aí vc compila em uma DLL.Depois tem q chamar essa DLL no seu programa com a função System.loadLibrary(?NomedaDLL?). E pronto…
Vc ñ vai precisar modificar o código para ter acesso, só precisa ter acesso à biblioteca onde o código está.Aí vc cria uma função com a convenção JNIEXPORT q chama a função q vc quer usar.Aí vc passa os parâmetros para a função desejada e quando ela retornar o resultado vc passa de volta para o Java.
Espero ter ajudado.

Obrigado pela ajuda NielsRX, seu comentário foi excelente e já serviu para acabar com a minha dúvida a respeito do JNI. Concordo contigo sobre a integração de Java com C, nesse caso, o meu problema é que eu tenho algumas rotinas em C no AIX, que geram um “MathCode” de uma entidade de endereço, para não ter duplicidade de dados, então tenho uma aplicação WEB que quando o internauta for efetuar um cadastro, ele
traga uma relação de endereços possíveis de acordo com o que for digitado, e como esse “MathCode” é relacionado como chave, preciso utlizar essa rotina já pronta, que pega os dados digitados, transforma em “MathCode”, e busca os provaveis resultados, comparando o código gerado com os existentes, ou então precisarei criar uma nova função em Java, substituindo esta rotina, ou até mesmo criar uma nova entidade independente para satisfazer as necessidades do cliente… Tudo depende do prazo… bem depois eu me viro…rs… Muito obrigado por sua atenção…
Valeu…