jni编程,jni编程指南
JVM封装了各种操作系统的实际差异,并提供了JNI技术,这是一种双向接口,使开发者能够通过Java代码调用各种本机库,反之亦然。因此,JNI(JavaNativeInterface)可以作为Java语言的一部分,可以作为粘合剂将Java应用与其他本地应用(C/C,Delphi)结合起来。
下图描述了JNI在Java应用中的地位和作用:
作为双向接口,JNI可以支持两种本机代码:nativelibraries和nativeapplications。
(1)可以用JNI写一些nativemethods,让JavaApplications调用nativelibraries中的函数。nativemethods的具体实现在C、C或Delphi中都是可能的。
(2)JNI还支持在本地应用程序中嵌入一个JVM来执行用Java语言编写的模块。比如用C写的浏览器,用内嵌的JVM执行本地下载的applet。
实现“JNI-JavainvokeNativeLibrary”的一般步骤如下:
1)完成Java代码,编写Java调用类。
2)编译你的Java类
3)用javah生成编译后的类文件对应的C/C函数头文件
4)在头文件中实现函数原型,编写原生代码。
5)将本机代码编译打包到DLL库(win32)或共享库(Linux)中
6)运行您的Java代码。
手动编译HelloJNI
环境和工具:
win7x64
jdk1.7.0
vs 2012编译器forx64
当前目录:E:\ programming \ practice \ Java \ JNI
编写java代码
//HelloJNI.java
# IFN def _ Included _ edu _ ZT _ JNI _ hello JNI
# define _ Included _ edu _ ZT _ JNI _ hello JNI
#ifdef__cplusplus
外部 C{
#endif
JNIEXPORTvoidJNICALLJava _ edu _ ZT _ JNI _ hello JNI _ say hello
(JNIEnv*,job object);
#ifdef__cplusplus
}
#endif
#endif
注意,上面的头文件包含一个外部头文件jni.h,它可以在%jdk%\include\中找到。但是,jni_md.h文件也包含在jni.h中,该文件位于%jdk%\include\win32中。
因此,jni.h和jni_md.h文件被复制到当前目录,并且edu_zt_jni_HelloJNI.h文件中的内容被改变
JNIEXPORTvoidJNICALL
Java _ edu _ scu _ JNI _ hello JNI _ say hello(JNIEnv * env,jobjectobj)
{
printf(HelloJNI!);
}
因为这台机器用的是64位的javaVM,所以需要编译成64位的程序,因为还需要一个为64位程序设计的编译器。这里我用的是vs2012的64位编译器来编译。
查找:开始菜单-Microsoft Visual Studio 2012-Visual Studio Tools-VS 2012 x64 cross Tools命令提示符。点击打开为编译64位程序配置的命令行(主要是设置了一些PATH和LIB)。
该命令行中具体配置了什么?您可以查看vcvarsall.bat文件。
检查vs 2012 x64 cross tools command prompt快捷方式的属性。目标位置包含以下内容:
% com spec %/k D:\ program files(x86)\ Microsoft visual studio 11.0 \ VC \ vcvarsall . bat x86 _ amd64
warning link 4197:exportxxspecifiedmultipletimes;使用第一个规范
1利用nativecode的平台依赖性,展示其在平台相关编程中的优势。
然而,任何事情都有两面性,JNI编程也是如此。程序员在使用JNI的时候,要意识到JNI编程的以下弊端,只有扬长避短,才能写出更加完善、高性能的代码:
1从Java环境到nativecode的上下文切换耗时且效率低下。
如何编写http://blog.csdn.net/todototry/article/details/1638849的动态链接库(windowsdll)
http://blog.csdn.net/ididcan/article/details/6828982JNI简单的实现了Java调用C/C的HelloWorld
播客传智_王泽友_JNI第一讲
http://www . IBM . com/developer works/cn/Java/j-lo-JNI leak/index . html?ca=DRS——避免JNI编程中的内存泄漏
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。