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确实有区别,也需要验证,但从设计角度讲,认为上述的方式更为合理。不足之外还有待于和大家多多交流。

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