Ainda JNI (Quase pronto)

7 respostas
F

Bom dia.

Consegui gerar a dll HelloWorld.dll a partir dos arquivos que criei chamados HelloWorld.h e HelloWorld.c, através do Dev-C++. Mas agora quando executo a classe que criei o seguinte erro é retornado:

Exception in thread main java.lang.UnsatisfiedLinkError: print

at jni.HelloWorld.print(Native Method)

at jni.HelloWorld.main(HelloWorld.java:6)

Estas são as classes que criei:

package jni;

class HelloWorld {
	private native void print();
	public static void main(String[] args) {
		new HelloWorld().print();
	}
	static {
		System.loadLibrary("HelloWorld");
	}
}

HelloWorld.h:

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

#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     HelloWorld
 * Method:    print
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_HelloWorld_print
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

HelloWorld.c:

#include <jni.h>
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
#include "HelloWorld.h"

JNIEXPORT void JNICALL
Java_HelloWorld_print(JNIEnv *env, jobject obj)
{
    printf("Hello World!\n");
    return;
}

A dll gerada já está em C:\WINDOWS\system32

Algúem tem alguma idéia do que possa ser?

7 Respostas

F

Só para constar:
O erro retornado ocorre quando tento executar a classe através do Eclipse.

G

coloca o loadLibrary dentro de um try catch para o erro ser mais especifico, ai vamos saber se o erro é na hora de carregar ou na execução.
Nem sempre o LinkError é claro quantoa isso

eliziario

A DLL está em algum diretório que esteja no PATH do ambiente?
Ou ainda, vc tem certeza que vc nao tem uma versão antiga dessa sua mesma dll (com assinaturas diferentes dos meétodos. em um diretório do PATH que apareça antes do diretório em que está a versão correta da sua DLL?

F

Tenho certeza sim. Já tentei usar o método loadLibrary de duas formas:

System.loadLibrary(HelloWorld);

e

System.loadLibrary(HelloWorld.dll);

Porém, em ambas ocorreu erro. Acho que a DLL, apesar de ter sido compilada sem nenhum erro, não deve estar íntegra, pois no exemplo que tenho ela é compilada através do prompt por um comando que vem c/ o Visual C++,o qual não possuo, e não, como fiz através de um projeto da opção DLL no Dev-C++.

Este é o comando:

cl -Ic:\java\include -Ic:\java\include\win32
-MD -LD HelloWorld.c -FeHelloWorld.dll

eliziario

Ops…
Erro simples. Sua classe está na package jni, certo? então o nome do método na dll deveria ser Java_jni_HelloWorld_print.
UnsatisfiedLinkError é justamente a exceção disparada quando um método nativo não pode ser encontrado nas bibliotecas nativas carregadas.

F

Pô cara fiz isso que você disse e deu certinho. Valeu mesmo! Você já meche com JNI há algum tempo? Agora já sei quem procurar quando tiver problemas :lol: …

eliziario

Ehehe. Disponha…
Por falar nisso, quando eu tenho que fazer algo em C pra rwindows eu tenho usado o Visual C++ Express da Microsoft, que por enquanto é de grátis. Não é uma IDE poderosa como o Eclipse ou o IntelliJ (por exemplo, não tem refactorings, mas qual IDE C tem?) mas é bem prático se vc instalar o PSDK (Platform SDK).
abs

Criado 29 de julho de 2006
Ultima resposta 1 de ago. de 2006
Respostas 7
Participantes 3