блок catch не работает в нативной библиотеке c ++

Я пишу нативную библиотеку 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)

10

Решение

Я попробовал ваш пример и все прошло хорошо. Моя среда — Ubuntu 12.04 (64bit) с Oracle JDK 1.7.

Итак, я думаю, что ваше окружение является виновником. Так как вы используете опцию -m64, это может быть несоответствие между 32-битной системой и 64-битной libtest.so.

Пожалуйста, проверьте, что ваша система, JDK, gcc и т. Д. Подходят друг другу.

1

Другие решения

Похоже, исключение не было учтено. Пытаться

int i=1;

try {
throw i;
}

может быть проблема с int размер или что-то? Или вы забыли перекомпилировать?

0

Расширяется ли JNIExport или JNICALL для определения связи c? если это так, то вы вызываете исключение C ++ в функции c, и я не уверен, что поведение определено.

может быть попробовать что-то вроде

namespace
{
void impl()
{
... yourCode ...
}
}

JNIEXPORT void JNICALL Java_Test_helloWorld(JNIEnv *, jobject)
{
impl();
}
0
По вопросам рекламы [email protected]