2016-05-09 53 views
0

我有兩個共享庫A.dylib和B.dylib都對應靜態鏈接庫薩JNI複製在Mac OS X庫加載崩潰

當我只加載A.dylib與System.load或系統.loadLibrary,沒有問題。對於B.dylib也是如此。

但是,當我打開一前一後(順序並不重要),我看到了一些初始化代碼的第二加載庫崩潰。並且當我檢查堆疊,所述崩潰碼塊是介於S.A

不知何故S.A符號被A.dylib和B.dylib之間共享時它們都裝載。而這僅在Mac OS X發生堆棧清楚地表明,所述第二加載的一個調用經由第一加載的一個S.A的方法。更清楚;

  • 負載A.dylib
  • A#的init - >調用從靜態鏈接薩
  • 負載的方法B.dylib
  • B#的init - >通過從A.靜態鏈接薩調用一個方法dylib

我試圖在不同的類加載器中加載A.dylib和B.dylib,但是這並沒有改變結果。你知道是否有辦法阻止這種共享?

回答

0

嗯,我找到了解決辦法,

的問題是,我猜到了靜態庫被默認所以在最後出現是因爲重複的符號的名稱衝突暴露自己的符號。

在鏈接動態庫時,我將鏈接器標誌-exported_symbols_list設置爲僅包含暴露符號的輸入文本文件。就我而言,那些只是JNI層級的方法; _Java_package_methodName _JNI_OnLoad _JNI_OnUnload

-exported_symbols_list僅導出輸入文件中列出的符號。其餘的是隱藏的,因此我有沒有重複的符號。

我不知道爲什麼它不會在Linux和Windows發生,但。