jni编程,jni编程指南

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: