Usando DLL no Java

9 respostas
R

Estou com um problema na qual foi me disponibilizado uma DLL feita em C,
com todos os metodos dela para eu acessar em Java, só que estou tentando
utilizar o JNI e até agora não consegui, inclusive coloquei a dll no diretorio do System32 esta me retornando o seguinte erro:

java.lang.UnsatisfiedLinkError: C:\WINDOWS\system32\Suprema.dll: Can't find dependent libraries
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1751)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1676)
at java.lang.Runtime.loadLibrary0(Runtime.java:823)
at java.lang.System.loadLibrary(System.java:1030)
at SupremaNI.(SupremaNI.java:52)
Exception in thread "main"

Código Java:
public class SupremaNI {


	public native boolean IsSensorOn();

	public native boolean Initialize();
	
	public static void main(String[] args) {
		 SupremaNI name = new SupremaNI();
		 System.out.println(name.Initialize());
	}


	static {
		System.loadLibrary("Suprema");
	}
}

Codigo gerado pelo javah

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class SupremaNI */

#ifndef _Included_SupremaNI
#define _Included_SupremaNI
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     SupremaNI
 * Method:    IsSensorOn
 * Signature: ()Z
 */
JNIEXPORT jboolean JNICALL Java_SupremaNI_IsSensorOn
  (JNIEnv *, jobject);

/*
 * Class:     SupremaNI
 * Method:    Initialize
 * Signature: ()Z
 */
JNIEXPORT jboolean JNICALL Java_SupremaNI_Initialize
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

9 Respostas

Gobain

Isso não quer dizer q esta dll precisa de outras pra funcionar?

pintofree

Onde vc esta chamando o metodo nativo dela amigo?

Prudencio

Já tentou rodar ela de um projeto sem package?

Se o problema não for realmente dependencias de outras bibliotecas, o pacote pode nao estar evidenciado na DLL, o que geralmente lança este UnsatisfiedLinkError.

Se não tiver acesso ao código da DLL, tente usar a biblioteca JNA. Enquanto você não precisar passar alguma String como parametro, ela é uma maravilha! :smiley:

R

Eu estou chamando ela no metodo main, pois é o problema que ate tenho um código
JNA só que ja foi barrado a utilização dele e pedido para ser implementado em JNI, o que acontece
também é quem em casa ele me deu este erro abaixo, e na especificacao que foi passada ele retornaria um bool

Exception in thread main java.lang.UnsatisfiedLinkError: SupremaNI.Initialize()Z

at SupremaNI.Initialize(Native Method)

at SupremaNI.main(SupremaNI.java:50)
Prudencio

Você tem acesso ao código da DLL?

E quanto ao package? Tentou rodar a aplicação no package default (somente para testes, óbvio :P)

R

Eu so tenho a especificação, o código veio fechado em DLL mesmo,
sera que teria um descompilador para ele?
Sobre o package ja testei usar o default tbem naum adiantou, deu a mesma
mensagem.

Prudencio

Aí complica…Por aqui, utilizamos DLLs em Delphi, e temos de indicar o pack no nome do método a ser utilizado, além da nomenclatura ‘Java’.

procedure Java_br_com_empresa_utilitario_dlls_impl_Teste_executarMetodo(PEnv: PJNIEnv; Obj: JObject; ParametroString : JString; ParamentroInteiro: JInt); stdcall;

Conhece as dependencias da DLL?

Talvez ela precise de uma DLL do sistema, mas, ao menos eu não consegui utilizá-la no ‘System’ ou ‘System32’ sem a declaração de pack utilizando JNI, se você achar uma forma de fazer isto, eu realmente gostaria de saber :smiley:

Você pode procurar as dependencias e copiar as DLLs necessárias para o mesmo local da sua (supondo que você tenha uma documentação que as indique, ou contato com o detentor do código da DLL).

De outra maneira, só consigo imaginar formas de testar, mas não de resolver o problema.

Googleando um pouco, descobri que DLLs geradas pelo Borland c++ precisam de uma outra biblioteca que não se encontra na System32: cc3260.dll

Bastaria copiar para lá e tudo estaria ok! Como sua DLL foi criada em C, essa é uma possibilidade.

[]s

R

Desculpa a demora, mas joguei la para a pasta do System32 continou com os mesmos
erros, talvez esteja faltando outra DLL também, será que o código em C não teria
que ser feito pensando em ser utilizado pelo JAVA(JNI)?

Prudencio

Nunca utilizei DLLs em C, na verdade, a idéia de usar uma DLL em java não me desce bem…

As DLLs Delphi que utilizamos para manter a transição parcial do sistema TEM de serem feitas visando sua utilização pelo JNI, aliás, como te mostrei ali em cima…

Se esse for seu caso e a DLL não foi feita assim, é problema…

Já entrou em contato com o fornecedor da DLL?

Criado 21 de outubro de 2008
Ultima resposta 30 de out. de 2008
Respostas 9
Participantes 4