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