Problemas com JNI

Já tentei usar o JNI, mas só tá dando erro no teste q fiz (antes q fazer com a dll da BEMATECH).

Estrutura do projeto:
JNI

  • teste
  • Calculadora.class
  • Calculadora.java
  • Calculadora.dll
  • teste_Calculadora.h
  • Calculadora.c

Minha classe é:
view plaincopy to clipboardprint?

  1. package teste;
  2. import javax.swing.JOptionPane;
  3. public class Calculadora
  4. {
  5. public native void helloJNI();  
    
  6. public native int soma(int a, int b);  
    
  7. static  
    
  8. {         
    
  9.     System.loadLibrary("Calculadora");          
    
  10. }  
    
  11. public static void main(String[] args)   
    
  12. {  
    
  13.     Calculadora calc = new Calculadora();  
    
  14.     calc.helloJNI();  
    
  15.     int c = calc.soma(5,6);  
    
  16.     JOptionPane.showMessageDialog(null, c, "Calculadora", 1);         
    
  17. }  
    
  18. }

package teste; import javax.swing.JOptionPane; public class Calculadora { public native void helloJNI(); public native int soma(int a, int b); static { System.loadLibrary(“Calculadora”); } public static void main(String[] args) { Calculadora calc = new Calculadora(); calc.helloJNI(); int c = calc.soma(5,6); JOptionPane.showMessageDialog(null, c, “Calculadora”, 1); } }

Daí gerei o arquivo teste_Calculadora.h com o javah

view plaincopy to clipboardprint?

  1. /* DO NOT EDIT THIS FILE - it is machine generated */
  2. #include <jni.h>
  3. /* Header for class teste_Calculadora */
  4. #ifndef _Included_teste_Calculadora
  5. #define _Included_teste_Calculadora
  6. #ifdef __cplusplus
  7. extern “C” {
  8. #endif
  9. /*
    • Class: teste_Calculadora
    • Method: helloJNI
    • Signature: ()V
  10. */
  11. JNIEXPORT void JNICALL Java_teste_Calculadora_helloJNI
  12. (JNIEnv *, jobject);
  13. /*
    • Class: teste_Calculadora
    • Method: soma
    • Signature: (II)I
  14. */
  15. JNIEXPORT jint JNICALL Java_teste_Calculadora_soma
  16. (JNIEnv *, jobject, jint, jint);
  17. #ifdef __cplusplus
  18. }
  19. #endif
  20. #endif

/* DO NOT EDIT THIS FILE - it is machine generated / #include <jni.h> / Header for class teste_Calculadora / #ifndef _Included_teste_Calculadora #define _Included_teste_Calculadora #ifdef __cplusplus extern “C” { #endif / * Class: teste_Calculadora * Method: helloJNI * Signature: ()V */ JNIEXPORT void JNICALL Java_teste_Calculadora_helloJNI (JNIEnv , jobject); / * Class: teste_Calculadora * Method: soma * Signature: (II)I */ JNIEXPORT jint JNICALL Java_teste_Calculadora_soma (JNIEnv *, jobject, jint, jint); #ifdef __cplusplus } #endif #endif

Então gerei o arquivo Calculadora.c :

view plaincopy to clipboardprint?

  1. #include <stdio.h>
  2. #include <jni.h>
  3. #include “teste_Calculadora.h”
  4. JNIEXPORT void JNICALL Java_teste_Calculadora_helloJNI
  5. (JNIEnv *env, jobject obj)
  6. {
  7.   printf("Hello JNI!");      
    
  8. }
  9. JNIEXPORT jint JNICALL Java_teste_Calculadora_soma
  10. (JNIEnv *env, jobject obj, jint a, jint b)
  11. {
  12.       return a + b;  
    
  13. }

#include <stdio.h> #include <jni.h> #include “teste_Calculadora.h” JNIEXPORT void JNICALL Java_teste_Calculadora_helloJNI (JNIEnv *env, jobject obj) { printf(“Hello JNI!”); } JNIEXPORT jint JNICALL Java_teste_Calculadora_soma (JNIEnv *env, jobject obj, jint a, jint b) { return a + b; }

Para gerar a dll baixei o cygwin para compilar e usei o seguinte comando:

gcc -Wall -mno-cygwin -I “C:\Arquivos de programas\Java\jdk1.6.0_02\include” -I “C:\Arquivos de programas\Java\jdk1.6.0_02\include\win32” -shared -o Calculadora.dll Calculadora.c

Então quando vou rodar a classe Calculadora aparece o seguinte erro:
Exception in thread “main” java.lang.UnsatisfiedLinkError: teste.Calculadora.helloJNI()V
at teste.Calculadora.helloJNI(Native Method)
at teste.Calculadora.main(Calculadora.java:19)

Dá para arrumar este negócio aí? Copiar e colar código do GUJ vem deste jeito horrível.

UnsatisfiedLinkError significa “não achei este método na DLL” ou então “não achei a DLL”. Verifique se você compilou a DLL corretamente e se ela está na pasta certa.

Obrigado pela dica, mas desisti do JNI e to implementando td em JNA de forma mais rápida e fácil.

Basta você compilar com o javah que a jre gerará um ponto aplic.h.

Voce desenvolve a dll em C em cima deste aplic.h.