Sto scrivendo una libreria nativa java in C++ e utilizzo la gestione delle eccezioni all'interno della stessa lib nativa, ma la libreria si blocca non appena lancio un'eccezione. Ecco il mio semplice programma di test, quando lo chiamo dal test di Java, si blocca appena viene lanciata un'eccezione. Il blocco catch non funziona. Qualche idea su ciò che mi manca. Grazie.blocco catch non funziona nella libreria nativa C++
#include "Test.h"
#include <iostream>
JNIEXPORT void JNICALL Java_Test_helloWorld(JNIEnv *, jobject)
{
std::cout<<"Hello World";
try {
throw 1;
}
catch(int)
{
std::cout<<" catch int block"<<std::endl;
}
catch(...)
{
std::cout<<" catch block"<<std::endl;
}
}
compilare e linkare:
g++ -m64 -fPIC -fexceptions -c test.cpp
g++ -shared -m64 -Wl,-soname,libtest.so -Wl,-shared-libgcc test.o -o libtest.so
$ java -d64 -Djava.library.path=/home/vkumar/projects/test -cp $CLASSPATH Test
terminate called after throwing an instance of 'int'
terminate called recursively
Hello World^CAbort (core dumped)
quale piattaforma? quale venditore e versione di java? –
SunOS 5.10, GCC 4.3.3 e JDK 1.6.0, ho provato a compilare tutto in modalità a 32 bit, ma gli stessi risultati. – vkumar
Ricordo di aver avuto un problema simile alcuni anni fa su Solaris. Allora, il problema stava usando GCC, il linker GNU e le librerie condivise. Abbiamo risolto il problema utilizzando il linker Sun e collegando a file binari statici. Ovviamente, l'implementazione try/catch di GCC richiedeva il supporto del linker che non era compatibile con il linker dinamico di Sun. Si potrebbe provare a utilizzare un linker diverso, poiché l'andare statico non aiuterà in un ambiente Java. – h2stein