10

我正在用 c++ 编写一个 java 本机库,并在本机库本身中使用异常处理,但是一旦我抛出异常,库就会崩溃。这是我的简单测试程序,当我从 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)
4

3 回答 3

1

我试过你的例子,一切都很顺利。我的环境是带有 Oracle JDK 1.7 的 Ubuntu 12.04(64 位)。

所以,我的猜测是你的环境是罪魁祸首。由于您使用 option -m64,它可能是 32 位系统和 64 位 libtest.so 之间的不匹配。

请验证您的系统、JDK、gcc 等是否适合。

于 2012-10-19T19:29:29.887 回答
0

看起来异常没有被捕获。尝试

int i=1;

try {
    throw i;
}

可能是int尺寸问题还是什么?或者你忘了重新编译?

于 2012-10-19T19:29:49.997 回答
0

JNIExport 或 JNICALL 是否扩展以定义 c 链接?如果是这样,那么您将在 ac 函数中引发 C++ 异常,我不确定该行为是否已定义。

也许尝试类似的东西

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

JNIEXPORT void JNICALL Java_Test_helloWorld(JNIEnv *, jobject)
{
   impl();
}
于 2012-11-21T20:50:05.837 回答