🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
在开始讲JNI用在你的应用程序之前,最好花时间思考下是否又更合适的解决方案.毕竟使用JNI会有很潜在的风险. 当然了,有很多可选方式允许Java应用程序与其他语言完成的应用程序进行通信,例: * 一个Java应程序可以通过TCP/IP连接或者通过其他IPC通信机制与原生应用进行通信. * 一个Java应用可以通过JDBC连接到一个传统的数据库上. * 一个Java应用程序可以使用Java IDL API等分布式对象策略的优势. 以上所有策略的共性就是将Java应用程序和原生代码隔离到不同的进程空间去(有的时候甚至是不同的机器上).进程隔离提供了一种很重要的优势.进程所提供的地址空间保护可以高度的隔离运行时错误--一个崩溃了原生应用不会立即终止正在与他通过TCP/IP进行通信Java应用. 有的时候,Java应用程序和原生代码存在于相进程空间是有必要的,这也是JNI的价值所在,想象下如下场景吧: 一个应用程序需要使用一些宿主相关的特性,而这些特性是Java API不支持的.例如,一个应用程序想使用一些Java API不支持文件操作,而通过另一个进程操作文件又是繁杂且低效的. 你可能想要访问一个现存的原生库,并且不想为不同的进程之间复制或传输数据买单,毫无疑问,在同一个进程加载原生库更加高效. 一个自身跨进程实现的应用可能导致不可接受的内存占用,尤其是当这些进程需要运行在同一台宿主机器上时候.将原生库加载到一个当前存在进程中比启动一个新进程然后在那个进程中加载要消耗更少的资源. 你可能想使用低层次语言(比如汇编)实现程序中某一时间要求比较高的功能,比如一个3D应用程序大多数时间都消耗在图形渲染上,你会想要讲这部分渲染代码使用汇编语言实现来达到最号的性能. 总之,最好在你的程序必须在当前进程中与原生代码进行协作的时候使用JNI.