2015-11-13 69 views
3

我在C++中實現了一個SDK(以C導出的API)。該SDK編譯成用於Windows的DLL和用於Linux的.so。我還使用JNA實現了一個Java包裝器。這個包裝器附帶.so和DLL,我在運行時檢查哪個操作系統正在運行,並將它解壓到開發人員指定的文件夾中。它運作良好。System.loadLibrary適用於OpenJDK,但不適用於Oracle

問題是,一個使用Linux的客戶(我在Linux上只有他們幾個人)說,該庫沒有加載一個未定義的符號錯誤。以下是錯誤:

java.lang.UnsatisfiedLinkError中:/usr/lib/libBXSDK.so:/usr/lib/libBXSDK.so:未定義的符號:_ZTVN10__cxxabiv117__class_type_infoE

起初我以爲這可能與某些標準有關,所以不存在。然後我給他發了一個非常基本的C++可執行文件,並讓他跑步。有效。然後我給他發了一個非常基本的Java應用程序,它不使用SDK,但只調用System.loadLibrary(「BXSDK」)。將libBXSDK.so複製到/ usr/lib後,他運行基本的Java應用程序,錯誤也是一樣的。

然後我決定檢查他的Java版本,並且意識到他使用的是Oracle JDK最新版本,我看到在運行CentOS 7(客戶運行RHEL 7)的測試環境中,我使用OpenJDK。我立即在測試環境中安裝了Oracle JDK,並且看到了同樣的問題。

所以,我的問題是。 Oracle JRE和OpenJDK(JRE)之間有什麼區別,導致這個問題?我是否做錯了我的.so OpenJDK能夠處理但Oracle JRE不是?

感謝

+0

「C++ filt」將該錯誤名稱翻譯爲__cxxabiv1 :: __ class_type_info的vtable。我懷疑這可能與您鏈接的標準C++庫,或調用編譯器的方式或缺少標誌有關。 –

+0

但我不明白的是,如果它是我構建.so的方式的問題,爲什麼它與C++可執行文件一起使用,並且使用OpenJDK加載它? – user1862876

回答

1

你驗證,如果該文件夾是在這篇文章中提到的情況:http://ubuntuforums.org/showthread.php?t=1323888

研究員(dontexist)成員的評論是一般相當有效,但事實上,OpenJDK的能夠使調用讓我覺得如果庫加載本身不成功。

我想,這可能不需要回答這個問題 - 「Oracle和Open JDK在加載語義上有什麼區別」。不知道我是否可以收回這篇文章作爲答案,但讓其他人藉此機會解釋一下。

相關問題