Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
挡块在c+中不工作+;本地图书馆 我在C++中编写了java原生库,在原生LIB本身中使用异常处理,但是当我抛出异常时,库崩溃了。这是我的简单测试程序,当我从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; } }_Java_C++_Exception_Java Native Interface_Native - Fatal编程技术网

挡块在c+中不工作+;本地图书馆 我在C++中编写了java原生库,在原生LIB本身中使用异常处理,但是当我抛出异常时,库崩溃了。这是我的简单测试程序,当我从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; } }

挡块在c+中不工作+;本地图书馆 我在C++中编写了java原生库,在原生LIB本身中使用异常处理,但是当我抛出异常时,库崩溃了。这是我的简单测试程序,当我从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; } },java,c++,exception,java-native-interface,native,Java,C++,Exception,Java Native Interface,Native,我试过你的例子,一切都很顺利。我的环境是Ubuntu12.04(64位)和OracleJDK1.7 所以,我猜你的环境是罪魁祸首。由于您使用选项-m64,32位系统和64位libtest.so之间可能不匹配 请验证您的系统、JDK、gcc等是否完全匹配。看起来异常未被破坏。试一试 int i=1; try { throw i; } 可能是int大小或其他问题?还是忘记重新编译?是JNIExport还是JNICALL正在扩展以定义c链接?如果是这样,那么您在C函数中抛出C++异常,并且

我试过你的例子,一切都很顺利。我的环境是Ubuntu12.04(64位)和OracleJDK1.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();
}

什么站台?java的供应商和版本是什么?SunOS 5.10、GCC 4.3.3和JDK 1.6.0,我尝试以32位模式编译所有这些,但结果相同。我记得几年前在Solaris上遇到过类似的问题。当时的问题是使用GCC、GNU链接器和共享库。我们通过使用Sun链接器和链接到静态二进制文件解决了这个问题。显然,GCC的try/catch实现需要与Sun动态链接器不兼容的链接器支持。您可以尝试使用不同的链接器,因为在Java环境中使用静态链接器是没有帮助的。我将尝试一下,看看效果如何。我用solaris链接器进行了尝试,但结果相同。谢谢,我将检查所有相关组件之间的兼容性。我使用的是Solaris 5.10、GCC4.3.3和JDK1。6@vkumar我用OpenJDK 6和OpenJDK 7(gcc 4.6.3)重试了一次。同样的结果:成功。感谢Olaf,我将尝试使用不同版本的GCC。我们的目标产品环境。如果是Sun Solaris,我将无法改变这一点。但是如果它的编译器出现问题,我可以随时升级它。再次感谢。奥拉夫-你说得对。我构建了32位libtest.so,它在32位模式下运行良好。这是否意味着我需要安装64位java?我的印象是,使用-d64模式的java可以确保服务器在64位模式下运行?@vkumar这似乎是32位(i386)。它解释了为什么代码在32位模式下工作,而在为64位环境编译时不工作。不,我确保删除了.so、.o并重新编译了所有内容。即使int size有问题,catch(…)也应该捕获它。在extern“C”函数中抛出并捕获异常不是问题。让异常逃逸上述函数将是一个问题。
namespace 
{
  void impl() 
  {   
     ... yourCode ...
  } 
}

JNIEXPORT void JNICALL Java_Test_helloWorld(JNIEnv *, jobject)
{
   impl();
}