10

C++ で Java ネイティブ ライブラリを作成し、ネイティブ ライブラリ内で例外処理を使用していますが、例外をスローするとすぐにライブラリがクラッシュします。これが私の簡単なテスト プログラムです。Java テストから呼び出すと、例外がスローされるとすぐにクラッシュします。catch ブロックが機能していません。私が見逃しているアイデア。ありがとう。

#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

私はあなたのexampleaを試しましたが、すべてうまくいきました。私の環境は、Oracle JDK1.7を搭載したUbuntu12.04(64ビット)です。

だから、私の推測では、あなたの環境が原因だと思います。オプションを使用-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 に答える