1. 程式人生 > >JNI載入靜態庫及多執行緒操作交流貼

JNI載入靜態庫及多執行緒操作交流貼

載入so問題,標準方法就可以了,有的時候需要用到靜態庫,即*.a,這時候System.load和System.loadLibrary無法將其載入,解決方法是將這些引用在C++的開發環境中配置好,一同編譯成so檔案,供JNI呼叫。

這些在單執行緒中都沒有問題,但如果是多執行緒呢?同樣的方式,將呼叫JNI的class定義成Thread的子類,以子執行緒的方式執行,會出現錯誤,以段錯誤居多,所以這裡也透露出JNI多執行緒操作的一個設計方式,即如果C++部分需要以子執行緒方式執行,最好不要以Java開啟執行緒,而應該在C++內部實現多執行緒,並把執行緒的操作封裝成JNI供Java呼叫,Java部分遵循單執行緒與C++進行呼叫。

注:,當然這裡是否真的是System.load和System.loadLibrary無法載入*.a檔案還有待驗證,同時靜態庫的引用順序也關係到執行的成功與否。另外,多執行緒的呼叫,因為我的C++程式功能複雜,涉及不少的網路協議的實現,是否是子執行緒載入so與單執行緒載入so確實有區別,也需要驗證,但從設計角度講,認為上述的方式更為合理。不足之外還有待於和大家多多交流。