Pergunta

Eu encontrei esta biblioteca de código aberto que eu quero usar no meu aplicativo Java. A biblioteca é escrito em C e foi desenvolvido sob Unix / Linux, e meu aplicativo será executado no Windows. É uma biblioteca de funções matemáticas em sua maioria, por isso, tanto quanto eu posso dizer que não usa qualquer coisa que é dependente de plataforma, que é código apenas muito básico C. Além disso, não é tão grande, menos de 5.000 linhas.

O que é a maneira mais fácil de usar a biblioteca na minha aplicação? Eu sei que há JNI, mas que envolve encontrar um compilador para compilar a biblioteca no Windows, recebendo up-to-date com o quadro JNI, escrever o código, etc. factível, mas não é fácil. Existe uma maneira mais fácil? Considerando o pequeno tamanho da biblioteca, eu estou tentado a apenas traduzi-lo para Java. Existem algumas ferramentas que podem ajudar com isso?


Editar

acabei traduzindo a parte da biblioteca que eu precisava para Java. É cerca de 10% da biblioteca até agora, embora ele provavelmente vai aumentar com o tempo. C e Java são bastante semelhantes, por isso só levou algumas horas. A principal dificuldade é corrigir os erros que são introduzidas por erros na tradução.

Obrigado a todos por sua ajuda. As soluções propostas tudo parecia interessante e eu vou olhar para eles quando eu preciso link para bibliotecas maiores. Para um pequeno pedaço de código C, tradução manual era a solução mais simples.

Foi útil?

Solução

Sua melhor aposta é provavelmente para pegar um livro bom c (K & R: A linguagem C Progranmming) uma xícara de chá e começar a traduzir! Gostaria de ser cético sobre confiar em um programa de tradução, mais frequentemente então não o melhor tradutor é você mesmo! Se você fizer este, em seguida, o seu feito e você não precisa manter re-fazê-lo. Pode haver algumas complicações se a biblioteca é de código aberto, você precisa verificar a licença cuidadosamente sobre isso. Outro ponto a considerar é que há sempre vai haver algum elemento de risco e erro potencial na tradução, portanto, pode ser necessário considerar escrever alguns testes para garantir que a tradução está correta.

Será que não existem funções JAVA equivelent matemática?

Como você se comentar a maneira JNI é possível, como para um compilador c você provavelmente poderia usar 'Bloodshead Dev-c ++' trabalho força, mas é um grande esforço para ~ 5000 linhas.

Outras dicas

Na Java GNU Scientific Library projeto eu usei Swig para gerar o JNI invólucro aulas em torno das bibliotecas C. Grande ferramenta, e também pode gerar o código invólucro em várias línguas, incluindo Python. Altamente recomendado.

eu compilá-lo e usar JNA.

JNA (Java Native Access) é faz basicamente em tempo de execução que JNI em tempo de compilação e does not necessidade de qualquer código não-java (não muito java quer).

Eu não sei sobre o seu desempenho ou usabilidade no seu caso, mas eu experimentá-lo.

Você tem certeza que quer usar a biblioteca C, mesmo que seja essa pequena?

Uma vez que 64 bit fica um pouco mais comum, você vai precisar para começar a construir / implantar ambas as versões da biblioteca de 32 bits e 64 bits também. E dependendo do que o código C é como, você pode ou não precisa atualizar o código para torná-lo construir como de 64 bits.

Se a biblioteca C é simples, pode ser mais fácil simplesmente porta da biblioteca C para java puro e não tem que lidar com a construção / implementação de uma biblioteca JNI, a biblioteca C eo código java.

Bem, há AMPC. É um compilador C para Windows, MacOS X e Linux, que pode compilar o código C em Java Código Byte (o tipo de código, que roda em uma máquina virtual Java).

AMPC

No entanto, é comercial e custa R $ 199 por licença. Duvido que compensa para você;) Eu não sei de qualquer compilador livre como aquele

.

OTOH, Java e C são bastante semelhantes. Você provavelmente poderia refatorar o código C para Java (estruturas podem ser substituídos por objetos com variáveis ??de instância públicas) e as operações de ponteiro geralmente pode ser traduzido para outra coisa (operações de matriz, por exemplo). Embora eu acho que você não quer passar por 5.000 linhas de código, não é?

Usando JNI faz com que a plataforma de código dependente, no entanto, se você diz que é plataforma C independente, não há nenhuma razão para que seu código Java deve ser dependente de plataforma. OTOH, dependendo de como caro estes cálculos são, usando JNI pode realmente comprar-lhe um ganho de desempenho, como quando se trata de número bruto rendimento de trituração, C ainda pode bater Java na velocidade. No entanto chamadas JNI são muito caros, por isso, se o cálculo é apenas um cálculo muito simples, rápida, o JNI chamar-se pode levar igualmente longa (ou até mais) do que o cálculo realizado, em caso usando o que JNI você vai comprar nada, mas retardando para baixo a sua aplicação e causando sobrecarga de memória.

Na verdade, ANJ parece impressionante, que exige menos esforço do que diretamente usando JNI. Mas em qualquer caso, você perderia a independência de plataforma, e uma vez que você provavelmente está usando apenas uma pequena parte dela, você pode considerar a traduzir o que você realmente precisa.

Você já tentou usando:

System.loadLibrary("mylibrary.dll");

Não tenho certeza se isso vai funcionar com uma biblioteca C pura, mas é provavelmente um tiro pena. :)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top