Usando DLL no Java

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:

[code]
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");
}

}[/code]

Codigo gerado pelo javah

[code]/* 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[/code]

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

Onde vc esta chamando o metodo nativo dela amigo?

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:

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)

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)

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.

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

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)?

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?