- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
JNI详细介绍
JNI详细介绍
/skywalker256/article/details/4677644
JNI其实是Java Native Interface的简称,也就是java本地接口。它提供了若干的API实现了和Java和其他语言的通信(主要是CC++)。也许不少人觉得Java已经足够强大,为什么要需要JNI这种东西呢?我们知道Java是一种平台无关性的语言,平台对于上层的java代码来说是透明的,所以在多数时间我们是不需要JNI的,但是假如你遇到了如下的三种情况之一呢?
?
你的Java代码,需要得到一个文件的属性。但是你找遍了JDK帮助文档也找不到相关的API。
在本地还有一个别的系统,不过他不是Java语言实现的,这个时候你的老板要求你把两套系统整合到一起。
你的Java代码中需要用到某种算法,不过算法是用C实现并封装在动态链接库文件(DLL)当中的。
对于上述的三种情况,如果没有JNI的话,那就会变得异常棘手了。就算找到解决方案了,也是费时费力。其实说到底还是会增加开发和维护的成本。
?
说了那么多一通废话,现在进入正题。看过JDK源代码的人肯定会注意到在源码里有很多标记成native的方法。这些个方法只有方法签名但是没有方法体。其实这些naive方法就是我们说的 java native interface。他提供了一个调用(invoke)的接口,然后用C或者C++去实现。我们首先来编写这个“桥梁”.我自己的开发环境是 j2sdk1.4.2_15 + eclipse 3.2 + VC++ 6.0,先在eclipse里建立一个HelloFore的Java工程,然后编写下面的代码。
Java代码?
package?com.chnic.jni;??
??
public?class?SayHellotoCPP?{??
??????
????public?SayHellotoCPP(){??
????}??
????public?native?void?sayHello(String?name);??
}??
[java]?view plaincopy
package?com.chnic.jni;??
??
public?class?SayHellotoCPP?{??
??????
????public?SayHellotoCPP(){??
????}??
????public?native?void?sayHello(String?name);??
}??
?
?一般的第一个程序总是HelloWorld。今天换换口味,把world换成一个名字。我的native本地方法有一个String的参数。会传递一个name到后台去。本地方法已经完成,现在来介绍下javah这个方法,接下来就要用javah方法来生成一个相对应的.h头文件。
?
javah是一个专门为JNI生成头文件的一个命令。CMD打开控制台之后输入javah回车就能看到javah的一些参数。在这里就不多介绍我们要用的是 -jni这个参数,这个参数也是默认的参数,他会生成一个JNI式的.h头文件。在控制台进入到工程的根目录,也就是HelloFore这个目录,然后输入命令。
Java代码?
javah?-jni?com.chnic.jni.SayHellotoCPP??
[java]?view plaincopy
javah?-jni?com.chnic.jni.SayHellotoCPP??
?
命令执行完之后在工程的根目录就会发现com_chnic_jni_SayHellotoCPP.h?这个头文件。在这里有必要多句嘴,在执行javah的时候,要输入完整的包名+类名。否则在以后的测试调用过程中会发生java.lang.UnsatisfiedLinkError这个异常。
?
到这里java部分算是基本完成了,接下来我们来编写后端的C++代码。(用C也可以,只不过cout比printf用起来更快些,所以这里俺偷下懒用C++)打开VC++首先新建一个Win32 Dynamic-Link library工程,之后选择An empty DLL project空工程。在这里我C++的工程是HelloEnd,把刚刚生成的那个头文件拷贝到这个工程的根目录里。随便用什么文本编辑器打开这个头文件,发现有一个如下的方法签名。
Cpp代码?
/*?
?*?Class:?????com_chnic_jni_SayHellotoCPP?
?*?Method:????sayHello?
?*?Signature:?(Ljava/lang/String;)V?
?*/??
JNIEXPORT?void?JNICALL?Java_com_chnic_jni_SayHellotoCPP_sayHello??
您可能关注的文档
- 03 历史 安康旬阳 王春地.doc
- 中软Java笔试题.docx
- JAVA编程基础-2-B-试卷.doc
- java双语试卷.doc
- JAVA笔试_深圳易思博.doc
- 《Java程序设计》模拟练习二.doc
- MySQL实验六.doc
- Java 考试题2.doc
- java-马士兵源码.doc
- jdbc连接池与数据源.doc
- 社会救助体系建设与残疾人权益保障:2025年现状与未来趋势报告.docx
- 无人机行业政策监管政策解读及2025年市场增长前景展望报告.docx
- 2025年国产光刻机双工件台系统技术创新与发展报告.docx
- 社交媒体平台算法推荐监管政策分析及2025年行业未来十年趋势展望报告.docx
- 煤化工产业绿色技术创新与2025年产业竞争力提升.docx
- 2025年丝绸产业人才培养与职业教育分析报告:行业人才战略布局.docx
- 2025年医疗器械出口欧洲市场合规性法规变化分析.docx
- 低空交通管理系统技术标准制定,2025年航空产业国际化战略报告.docx
- 中国半导体设备国产化率2025年技术创新与产业链升级路径研究.docx
- 智能网联汽车数据跨境流动合规性风险评估与合规性监管机制创新.docx
最近下载
- 生物产业园智慧园区智能化建设方案.pptx VIP
- 食品和医药级丙二醇市场分析:预计2031年全球市场规模将为13.67亿美元.docx
- Unit 3 Helping People Extended Reading 课件-2023-2024学年高中英语牛津译林版(2020)选修第二册.pptx VIP
- 烟草公司安全培训课件.pptx VIP
- 项目1 1.2 植物生产的两大要素(1)(课件)- 《植物生产与环境》(高教版第四版)同步精品课堂.pptx VIP
- GB_T 1184-1996__形状和位置公差未注公差值.pdf VIP
- 《火山喷发的成因及其作用》小学科学五年级上册PPT课件.pptx VIP
- 统编版九年级上册道德与法治期末质量监测试卷(含答案).docx VIP
- 2025(新版)化学检验工(高级)职业技能考试练习题库【附答案】.doc VIP
- 2025GWH252-16海上中速永磁风力发电机组.docx VIP
文档评论(0)