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?
- 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);
-
}
- }
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?
- /* 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
/* 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?
- #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;
- }
#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)