一、JNI介绍
博客专区 > unic0rn 的博客 > 博客详情
一、JNI介绍
unic0rn 发表于1年前
一、JNI介绍
  • 发表于 1年前
  • 阅读 60
  • 收藏 1
  • 点赞 0
  • 评论 6

腾讯云 技术升级10大核心产品年终让利>>>   

摘要: jni是java调用C语言/C++的一种技术,能够实现java对C程序代码的复用,并且利用C所带来的高执行效率,但是引入jni的同时,也会带来一系列的麻烦,破坏java本身的优势。
  1. 什么是JNI
  2. 为什么要使用JNI?
    1. 效率高
    2. 代码复用
  3. JNI带来的副作用

 

1.什么是JNI

        JNI(Java Native Interface) Java本地调用接口,它提供了若干的API实现了Java与其他语言的通信(主要是C&C++)。从Java1.1开始,JNI标准就成为了Java平台的一部分。

2.为什么要使用JNI?

    1)效率高

        在大多情况下,我们使用Java开发程序,但在一些对效率要求极高如音视频编解码的场景下,Java由于虚拟机的原因可能无法满足我们对性能的要求。而C或者C++的执行效率比Java快上几十倍,我们希望能使用C或C++来完成耗费效率的模块,让Java调用它完成业务功能。

    2)代码复用

        例如C对音视频处理的库,都是比较成熟的,在各方面的性能上都会比Java优越,如果通过JNI能使用C的库,那么意义上就是Java复用C的代码,极大节省了使用纯Java重新开发的时间。或者本身公司旧项目使用C,新项目可以复用之前的项目代码。

        还有一种情况是,例如你的项目需要完成一个获取cpu序列号的功能,但是你翻遍了api文档也没能找到可以调用的方法,这个情况下,你就可以考虑使用jni来完成。毕竟c的编程灵活性比java高许多。

 

3.JNI带来的副作用

        JNI并非绝对的有益无害。

    1)程序可移植性变差

        Java本身是在JVM上运行,可以跨Linux、windows、Mac各种平台运行,无需重新编译。而使用了JNI后,就依赖于本地调用,使程序的移植性大大降低。例如C,即使遵循POSIX标准也需要在目标平台重新编译才能让程序可以在Windows和Linux下运行。

    2)程序稳定性可能降低

        使用了JNI后,程序不再是绝对安全的,如果本地代码(C或C++)没有处理好,一旦发生异常将可能导致整个JVM崩溃,所以使用JNI处理需对本地代码(C或C++)十分熟悉,否则放在生产环境下时不时的出现问题又难以调试十分麻烦。

 

        在我的实际工作中,便碰到了如上所述的问题:我负责开发的是一个防盗报警系统,所有终端设备需要接入到系统中统一管理,有的设备是带摄像头的。当时分工是,我一个写C的同事负责设备控制和视频转发模块,我负责使用java调用他的模块进行业务处理,我java和他c的交互便使用到jni。这个项目使用jni明显的好处是,C模块网络编程处理这些设备的控制和视频转发效率十分高,但是十分严重的缺点也暴露了出来,开发调试十分不便,而且jni一旦报错会导致整个tomcat直接crash,无法对用户再提供服务,所以使用jni开发的时候要异常小心。现在系统正准备从windows平台迁移到linux平台,可是由于同事c编程的时候依赖了windows的api,导致无法直接迁移,目前只能等待同事将修改成遵循posix标准后才能进行平台移植。

 

 加我QQ:981656164,共同学习交流,记得备注 —— OSC!  ~~ <( ̄3 ̄)> 

标签: jni
共有 人打赏支持
粉丝 8
博文 75
码字总数 35725
作品 1
评论 (6)
小盒子_java
有个问题请教哈 我在使用jni调用c++的动态库的时候,有一个图片叠加在视频上的函数,而这个函数在java中的执行过程是大概1.2秒,正常吗?
unic0rn
图片叠加在视频上的函数?我不太明白你的意思
unic0rn

引用来自“小盒子_java”的评论

有个问题请教哈 我在使用jni调用c++的动态库的时候,有一个图片叠加在视频上的函数,而这个函数在java中的执行过程是大概1.2秒,正常吗?

图片叠加在视频上的函数?我不太明白你的意思
小盒子_java

引用来自“大爱阳哥”的评论

图片叠加在视频上的函数?我不太明白你的意思
就是第三方提供的台标机上叠加图片的一个函数,我用java通过jni调用,javac javaah 然后自己写了个dll, 最后测试 这个函数执行过程需要1.2秒左右
unic0rn

引用来自“小盒子_java”的评论

引用来自“大爱阳哥”的评论

图片叠加在视频上的函数?我不太明白你的意思
就是第三方提供的台标机上叠加图片的一个函数,我用java通过jni调用,javac javaah 然后自己写了个dll, 最后测试 这个函数执行过程需要1.2秒左右

java通过jni调用c速度是很快的,花了1.2秒应该是图片叠加函数处理时间占了大部分
小盒子_java

引用来自“大爱阳哥”的评论

引用来自“小盒子_java”的评论

引用来自“大爱阳哥”的评论

图片叠加在视频上的函数?我不太明白你的意思
就是第三方提供的台标机上叠加图片的一个函数,我用java通过jni调用,javac javaah 然后自己写了个dll, 最后测试 这个函数执行过程需要1.2秒左右

java通过jni调用c速度是很快的,花了1.2秒应该是图片叠加函数处理时间占了大部分
好的,明白了,谢谢
×
unic0rn
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: