Tôi đang viết thư viện gốc java trong C++ và sử dụng xử lý ngoại lệ trong chính lib tự nhiên, nhưng thư viện bị treo ngay khi tôi ném ngoại lệ. Đây là chương trình thử nghiệm đơn giản của tôi, khi tôi gọi nó từ thử nghiệm Java, nó chỉ bị treo ngay khi ngoại lệ được ném ra. Khối catch không hoạt động. Bất kỳ ý tưởng những gì tôi đang mất tích. Cảm ơn.khối catch không hoạt động trong thư viện gốc C++
#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;
}
}
Compile và Link:
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)
những gì nền tảng? nhà cung cấp và phiên bản java nào? –
SunOS 5.10, GCC 4.3.3 và JDK 1.6.0, tôi đã cố gắng biên dịch tất cả ở chế độ 32 bit nhưng có cùng kết quả. – vkumar
Tôi nhớ đã có một vấn đề tương tự cách đây vài năm trên Solaris. Quay lại sau đó, vấn đề đã được sử dụng GCC, liên kết GNU và thư viện được chia sẻ. Chúng tôi đã giải quyết vấn đề bằng cách sử dụng trình liên kết Mặt trời và bằng cách liên kết đến các tệp nhị phân tĩnh. Rõ ràng, việc thực hiện try/catch của GCC cần sự hỗ trợ liên kết không tương thích với trình liên kết động Sun. Bạn có thể thử sử dụng một trình liên kết khác, vì việc chuyển đổi tĩnh sẽ không giúp ích trong môi trường Java. – h2stein