JNI/JNA/C/C++ Linux + eNBioScan-F (Flat Scanner)

Seguinte pessoal, sou novo aqui mas já trabalho com java a mais de 3 anos. Surgiu na empresa em que trabalho a necessidade de integrar o scanner eNBioScan-F (Flat Scanner) no linux (Debian/Desktop Paraná v2.1.1). Como a empresa já possui a tradição de desenvolver software em java, tentei realizar a integração da libNBioAPI.so com o java via JNI ou JNA. O problema é que para os dois padrões eu recebo praticamente a mesma mensagem de erro como por exemplo: segment fault ou algo do tipo SIGINT : lbjvm.so… . Este erros sempre ocorrem quando tento iniciar o device realizando a chamada ao método openDevice(…) da lib. Para piorar já desenvolvi para teste todo o software em c++ utilizando a mesma lib e o problema não ocorreu. Detalhe: quando chamo o método para iniciar o device, o device é inicializado, mas quando o método da lib retorna para a vm, ocorre algum erro de acesso a memória e o programa em java é finalizado. Com JNA não tem para onde correr, pois para o programador ele acessa diretamente a lib, mas via JNI eu já tentei compilar de todas as formas possíveis a lib dinâmica para acessar a lib acima mas não obtive sucesso. Espero que alguém tenha uma idéia. Caso alguém queria, posso disponibilizar o código fonte e os comando que utilizei para compilar a lib intermediária.

Mais informações para JNI:
Arquivo JNIDemoJava.h:

   1. #include <jni.h>  
   2. /* Header for class jnidemojava_Main */  
   3.   
   4. #ifndef _Included_jnidemojava_Main  
   5. #define _Included_jnidemojava_Main  
   6. #ifdef __cplusplus  
   7. extern "C" {  
   8. #endif  
   9. /* 
  10.  * Class:     jnidemojava_Main 
  11.  * Method:    nativePrint 
  12.  * Signature: ()V 
  13.  */  
  14. JNIEXPORT void JNICALL Java_jnidemojava_Main_nativePrint  
  15.   (JNIEnv *, jobject);  
  16.   
  17. /* 
  18.  * Class:     jnidemojava_Main 
  19.  * Method:    initModule 
  20.  * Signature: ()I 
  21.  */  
  22. JNIEXPORT jint JNICALL Java_jnidemojava_Main_initModule  
  23.   (JNIEnv *, jobject);  
  24.   
  25. /* 
  26.  * Class:     jnidemojava_Main 
  27.  * Method:    openDevice 
  28.  * Signature: (I)I 
  29.  */  
  30. JNIEXPORT jint JNICALL Java_jnidemojava_Main_openDevice  
  31.   (JNIEnv *, jobject, jint);  
  32.   
  33. #ifdef __cplusplus  
  34. }  
  35. #endif  
  36. #endif  

Arquivo JNIDemo.c:


   1. #include "/usr/include/NBioAPI/NBioAPI.h"  
   2. #include "JNIDemoJava.h"  
   3.   
   4.   
   5. /* 
   6.  * Class:     jnidemojava_Main 
   7.  * Method:    nativePrint 
   8.  * Signature: ()V 
   9.  */  
  10. JNIEXPORT void JNICALL Java_jnidemojava_Main_nativePrint  
  11.   (JNIEnv *env, jobject obj)  
  12. {  
  13.     printf("\nHello World from C\n");  
  14. }  
  15.   
  16. /* 
  17.  * Class:     jnidemojava_Main 
  18.  * Method:    initModule 
  19.  * Signature: ()I 
  20.  */  
  21. JNIEXPORT jint JNICALL Java_jnidemojava_Main_initModule  
  22. (JNIEnv *end, jobject obj)  
  23. {  
  24.     NBioAPI_HANDLE handle = 0;  
  25.     NBioAPI_Init(&handle);  
  26.     return (jint)handle;  
  27. }  
  28.   
  29. /* 
  30.  * Class:     jnidemojava_Main 
  31.  * Method:    openDevice 
  32.  * Signature: (I)I 
  33.  */  
  34. JNIEXPORT jint JNICALL Java_jnidemojava_Main_openDevice  
  35.   (JNIEnv *env, jobject obj, jint handle)  
  36. {  
  37.     return (jint)NBioAPI_OpenDevice(handle, 0x00ff);  
  38. } 

Arquivo Main.java:

   1. package jnidemojava;  
   2.   
   3. /** 
   4.  * 
   5.  * @author fantini 
   6.  */  
   7. public class Main {  
   8.   
   9.     static {  
  10.         System.load("/home/fantini/NetBeansProjects/JNIDemoCdl-1/dist/libJNIDemoCdl-1.so");  
  11.     }  
  12.       
  13.     private native void nativePrint();  
  14.     private native int initModule();  
  15.     private native int openDevice(int handle);  
  16.     /** 
  17.      * @param args the command line arguments 
  18.      */  
  19.     public static void main(String[] args) {  
  20.         Main obj  = new Main();  
  21.         obj.nativePrint();  
  22.         int handle = obj.initModule();  
  23.         System.out.println(handle);  
  24.         System.out.println(obj.openDevice(handle));  
  25.     }  
  26.   
  27. }  

Exemplo de comando utilizado para gerar a lib dinâmica:

gcc -shared -m32 -ljsig   -c -g -I/usr/lib/jvm/java-6-openjdk/include -I/usr/lib/jvm/java-6-openjdk/include/linux -I/usr/lib/jvm/java-6-openjdk/jre/lib/i386 -fPIC  -o build/Debug/GNU-Linux-x86/JNIDemo.o JNIDemo.c mkdir -p dist 
gcc -shared -m32 -ljsig -o dist/libJNIDemoCdl-1.so -fPIC build/Debug/GNU-Linux-x86/JNIDemo.o -L/usr/lib/jvm/java-6-openjdk/jre/lib/i386 -lNBioBSP

Exemplo de erro que ocorre no retorno do método openDevice:

   1. 142843256  
   2. Warning: SIGINT handler expected:libjvm.so+0x4668e0  found:0x00000001  
   3. Signal Handlers:  
   4. SIGSEGV: [libjvm.so+0x464af0], sa_mask[0]=0x7ffbfeff, sa_flags=0x10000004  
   5. SIGBUS: [libjvm.so+0x464af0], sa_mask[0]=0x7ffbfeff, sa_flags=0x10000004  
   6. SIGFPE: [libjvm.so+0x464af0], sa_mask[0]=0x7ffbfeff, sa_flags=0x10000004  
   7. SIGPIPE: [libjvm.so+0x464af0], sa_mask[0]=0x7ffbfeff, sa_flags=0x10000004  
   8. SIGXFSZ: [libjvm.so+0x464af0], sa_mask[0]=0x7ffbfeff, sa_flags=0x10000004  
   9. SIGILL: [libjvm.so+0x464af0], sa_mask[0]=0x7ffbfeff, sa_flags=0x10000004  
  10. SIGUSR1: SIG_DFL, sa_mask[0]=0x00000000, sa_flags=0x00000000  
  11. SIGUSR2: [libjvm.so+0x4643a0], sa_mask[0]=0x00000004, sa_flags=0x10000004  
  12. SIGHUP: [libjvm.so+0x4668e0], sa_mask[0]=0x7ffbfeff, sa_flags=0x10000004  
  13. SIGINT: SIG_IGN, sa_mask[0]=0x00000000, sa_flags=0x00000000  
  14. SIGTERM: [libjvm.so+0x4668e0], sa_mask[0]=0x7ffbfeff, sa_flags=0x10000004  
  15. SIGQUIT: [libjvm.so+0x4668e0], sa_mask[0]=0x7ffbfeff, sa_flags=0x10000004  
  16. Java Result: 139  

[…]

Editado: Digitei algumas besteiras