Estou precisando invocar um metodo implementado em C# a partir de uma app java, pelo que eu vi na net o pessoal passa pra c++, vi tb sobre a jna, mas nao estou tendo sucesso, usando jna meu codigo esta assim:
public static void main(String args[]){
MySharedLibrary lib = (MySharedLibrary) Native.loadLibrary(“Teste01”, MySharedLibrary.class);
int i = lib.librarymethod(“metodoTeste”);
System.out.print(i);
}
e
namespace Teste01
{
public class Class2
{
static int metodoTeste()
{
return 2;
}
}
}
e está dando erro na hora de carregar a dll, onde eu coloco ela? É assim mesmo? Vai funcionar com C#/.Net??
Nao tenho acesso à pasta system32, tem como colocar a pasta da minha dll no path??
primeiro, qdo for postar algum codigo coloque dentro da taga [code].
para se trabalhar com JNA, vc deve fazer o seguinte:
1 - colocar a .dll dentro da pasta /system32 do windows
2 - vc deve implementar um interface no java que estenda Libary e que a assinatura do metodo deve ser a mesma coisa da sua biblioteca em C#, tipo de retorno, nome do metodo, tipo de parametro
3 - passe esse codigo para dentro da sua interface
Opa, desculpa a falha, corrigi as classes o codigo está assim:
//Classe main java
//Nao consigo colocar arquivos no System32, entao usei o metodo System.setProperty, agora, a parte de carregar a library está funcionando
public static void main(String args[]){
System.setProperty("jna.library.path", "D:/Documents and Settings/ke1x.PETROBRAS/Meus documentos/Visual Studio 2008/Projects/Teste01/Teste01/bin/Release/");
MySharedLibrary lib = (MySharedLibrary) Native.loadLibrary("Teste01", MySharedLibrary.class);
int i = lib.librarymethod();
System.out.print(i);
}
//Interface
public interface MySharedLibrary extends Library {
public int librarymethod();
}
//classe co mo metodo em c#
public class Class2
{
public static int librarymethod()
{
return 2;
}
}
Mas ainda está dando erro:
Exception in thread “main” java.lang.UnsatisfiedLinkError: Error looking up function ‘librarymethod’: Não foi possível encontrar o procedimento especificado.
Sendo que Teste01, é o nome da solution no Visual Studio, mais alguma ideia?? Estou perdido
public static void main(String args[]){
int i = MySharedLibrary.INSTANCE.librarymethod();
System.out.print(i);
}
public interface MySharedLibrary extends Library {
MySharedLibrary INSTANCE = (MySharedLibrary) Native.loadLibrary("Teste01", MySharedLibrary.class);
public int librarymethod();
}
public class Class2
{
public static int librarymethod() // cara nao sei, acho que vc vai ter problema com esse static, qualquer coisa vc tira ele
{
return 2;
}
}
e para funcionar vc deve ter uma um arquivo Teste01.dll no windows/system32
a) Você tem de registrar sua DLL .NET como se fosse COM (isso não é difícil mas deixa sua DLL um pouco lenta) e a seguir você tem de acessar isso usando um pacote como o Jacob ( http://sourceforge.net/projects/jacob-project/ ). Boa sorte
b) Você tem de comprar um software como o http://www.jnbridge.com/ ou o http://www.ezjcom.com/java.net.html - não sei se elas funcionam bem.
c) Você expõe sua classe C# como um web service, e então chama esse web service em Java. É um bocadinho lento também e exige hospedar sua classe C# em um web server como o IIS.
e deu o mesmo erro, eu só não coloquei a dll no system32, pq aqui eu nao tenho permissao pra isso, mas eu to usando o System.setProperty(“jna.library.path”, “…”), mas acho que esse não é o problema, vou pesquisar agora sobre o jacob, o que vc acha??