Estou com problema para conectar Java e C, via JNI, sempre está dando UnsatisfieldLinkError. Vejam como estou fazendo pra usar em um simples helloworld:
HelloNative.java:
public class HelloNative {
public static native void greeting();
static {
System.loadLibrary(“libHelloNative.dll”);
}
}
HelloNative.h atrevés do javah:
/* DO NOT EDIT THIS FILE - it is machine generated /
#include <jni.h>
/ Header for class HelloNative */
#ifndef _Included_HelloNative
#define _Included_HelloNative
#ifdef __cplusplus
extern “C” {
#endif
/*
- Class: HelloNative
- Method: greeting
- Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloNative_greeting
(JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif
HelloNative.c
#include “HelloNative.h”
#include<stdio.h>
JNIEXPORT void JNICALL Java_HelloNative_greeting
(JNIEnv *env, jclass cl)
{
printf(“Hello world!!!\n”);
}
e a classe principal
HelloNativeTest.java:
class HelloNativeTest {
public static void main(String args[]) {
HelloNative.greeting();
}
}
para compilar os arquivos java, estou fazendo java
para compilar o arquivo .c, usando gcc que vem com o DevC++:
gcc -o libHelloNative.dll HelloNative.c -I “C:\Arquivos de programas\Java\jdk1.5.0_04\include” -I “C:\Arquivos
de programas\Java\jdk1.5.0_04\include\win32” -c
eu também tentei colocar -c no lugar de -shared e nada
quando eu vou colocar para funcionar eu uso:
java HelloNativeTest
, mas sempre dá essa saída:
Exception in thread “main” java.lang.UnsatisfiedLinkError: no libHelloNative.dll
in java.library.path
at java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.lang.Runtime.loadLibrary0(Unknown Source)
at java.lang.System.loadLibrary(Unknown Source)
at HelloNative.(HelloNative.java:4)
at HelloNativeTest.main(HelloNativeTest.java:3)
eu tentei usar o método load, em vez do loadLibrary, mas consegui apenas no Linux e colocando o endereço absoluto(apenas com enedereço relativo não funcionava), no Ruindows não sai. Eu dei uma pesquisada e achei um exemplo idêntico que baixei que um cara fez, mas para compilar a dll ele usou o compilador do Visual C++(com outras opções de compilação, claro!!) e eu testei o exemplo que ele fez, e funcionou legal. Acredito que o problema esteja nas opções de compilação que estou passando para o gcc.
Se alguem souber onde estou errando, ajuda seria bem-vinda.
ah sim, antes que alguem fale que estou errado nisso, em:
HelloNative.java:
System.loadLibrary(“libHelloNative.dll”);
eu também testei usando apenas o nome da dll dessa forma:
System.loadLibrary(“libHelloNative”);
flw