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確實有區別,也需要驗證,但從設計角度講,認爲上述的方式更爲合理。不足之外還有待於和大家多多交流。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章