【课程介绍】
这课程,我们的主题就是对C函数,或是对Shared Library,或是对JNI的本地代码的代码写法,我们要讲求它的稳定性。也就是要让它有更好的设计,是我们对这设计做优化的思考,也是架构师的一个很重要的职责。本节,我提出一个原则是:<静态对静态,动态对动态>的原则。
【课程目标】
我们知道,在C层有*.SO,它有全局变量,不要将Java或C++对象参考储存于C层的全局变量,把动态的对象指针放在全局变量是不好的。这样可以增加C函数的稳定度,包括它的通用性,可适应于更多更多的环境里使用,表示它可以很稳定的适用于不同的run-time的动态环境上,都不会让C函数无意中爆掉或产生其它问题。
JNI,全称Java Native Interface,是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下都是必要的,比如当需要利用已有的C或C++库、提高性能、或者接入操作系统特定的功能时。在这个视频课程中,讲师会深入探讨如何通过JNI实现Java与C++的有效结合,特别关注代码的稳定性和设计优化。
课程的目标之一是避免在C层的全局变量中存储Java或C++对象的引用。全局变量在程序的整个生命周期内都存在,如果存储了Java或C++对象的引用,这些对象可能在C代码还在使用时就被Java垃圾回收器清理掉了,导致空指针异常或者其他未定义的行为。因此,讲师提出了“静态对静态,动态对动态”的原则。这意味着静态的数据结构(如C的全局变量)应该与同样静态的数据交互,而动态的数据(如Java对象引用)应该在运行时的环境中管理,避免长时间存储。
在C层,共享库(*.SO文件)通常包含一组静态定义的函数,它们可以被多个Java类调用。为了提高这些函数的稳定性和通用性,应避免在它们内部持有对Java对象的引用,特别是全局变量。这样做可以确保C函数独立于Java运行时环境,更适应于多线程环境和不同版本的Java虚拟机(JVM)。此外,这样的设计还能减少内存泄漏的风险,因为C函数不会意外地持有可能已经失效的Java对象。
使用JNI时,开发者需要编写Java部分的代码,声明native方法并加载相应的本地库,同时编写C或C++部分的代码,实现这些native方法。JNI头文件(javah工具自动生成)提供了接口,使得Java和C++代码能够顺利通信。这种通信包括但不限于调用C++函数,传递数据,以及执行回调等。
在性能方面,JNI允许直接访问硬件,从而在需要高效计算或低级别操作的场合提供显著优势。然而,使用JNI也有其挑战,比如内存管理、线程同步和异常处理,这些都是开发者需要注意和妥善解决的问题。
这个课程旨在教会学员如何通过JNI有效地结合Java和C++,实现稳定、高性能的应用程序。通过学习,开发者不仅能掌握JNI的基本使用,还能理解如何设计和优化跨语言的交互,以提升代码质量并减少潜在问题。通过遵循"静态对静态,动态对动态"的原则,开发者可以构建出更加健壮和灵活的系统,适应各种运行时环境。
评论0
最新资源