Problemas com JNI

3 respostas
ronnypeterson

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)

3 Respostas

victorwss

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.

ronnypeterson

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

A

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.

Criado 8 de janeiro de 2008
Ultima resposta 6 de fev. de 2008
Respostas 3
Participantes 3