Я пишу нативную библиотеку java на c ++ и использую обработку исключений внутри самой нативной библиотеки, но библиотека вылетает, как только я выкидываю исключение. Вот моя простая тестовая программа, когда я вызываю ее из теста Java, она просто вылетает, как только выдается исключение. Блок захвата не работает. Любые идеи, что я пропускаю. Благодарю.
#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;
}
}
Компиляция и ссылка:
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)
Я попробовал ваш пример и все прошло хорошо. Моя среда — Ubuntu 12.04 (64bit) с Oracle JDK 1.7.
Итак, я думаю, что ваше окружение является виновником. Так как вы используете опцию -m64
, это может быть несоответствие между 32-битной системой и 64-битной libtest.so.
Пожалуйста, проверьте, что ваша система, JDK, gcc и т. Д. Подходят друг другу.
Похоже, исключение не было учтено. Пытаться
int i=1;
try {
throw i;
}
может быть проблема с int
размер или что-то? Или вы забыли перекомпилировать?
Расширяется ли JNIExport или JNICALL для определения связи c? если это так, то вы вызываете исключение C ++ в функции c, и я не уверен, что поведение определено.
может быть попробовать что-то вроде
namespace
{
void impl()
{
... yourCode ...
}
}
JNIEXPORT void JNICALL Java_Test_helloWorld(JNIEnv *, jobject)
{
impl();
}