我在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不是?
感謝
「C++ filt」將該錯誤名稱翻譯爲__cxxabiv1 :: __ class_type_info的vtable。我懷疑這可能與您鏈接的標準C++庫,或調用編譯器的方式或缺少標誌有關。 –
但我不明白的是,如果它是我構建.so的方式的問題,爲什麼它與C++可執行文件一起使用,並且使用OpenJDK加載它? – user1862876