`
xubindehao
  • 浏览: 239133 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

JNI java本地接口

阅读更多

  学习了一下JNI,发表文章的时候不知道该选什么好了,不知道JNI应该属于那个范畴^_^。
  
  1.简介
   
  JNI是Java Native Interface的缩写,它的设计目的是:
  
  The standard Java class library may not support the platform-dependent features needed by your application.
  
  You may already have a library or application written in another programming language and you wish to make it accessible to Java applications
  
   You may want to implement a small portion of time-critical code in a lower-level programming language, such as assembly, and then have your Java application call these functions
  
  2.JNI的书写步骤
  
   编写带有native声明的方法的java类
  
  使用javac命令编译所编写的java类
  
  使用 javah ?jni java类名生成扩展名为h的头文件
  
  使用C/C++ 实现本地方法
  
   将C/C++ 编写的文件生成动态连接库
  
  ok
  
  1) 编写java程序:
  
  这里以HelloWorld为例。
  
  代码1:
  
  class HelloWorld {
  public native void displayHelloWorld();
  
   static {
  System.loadLibrary("hello");
  }
  
  public static void main(String[] args) {
  new HelloWorld().displayHelloWorld();
  }
  }
  
  声明native方法:如果 你想将一个方法做为一个本地方法的话,那么你就必须声明改方法为native的,并且不能实现。其中方法的参数和返回值在后面讲述。
  
   Load动态库:System.loadLibrary("hello");加载动态库(我们可以这样理解:我们的方法 displayHelloWorld()没有实现,但是我们在下面就直接使用了,所以必须在使用之前对它进行初始化)这里一般是以static块进行加载 的。同时需要注意的是System.loadLibrary();的参数“hello”是动态库的名字。
  
  main()方法
   
  2) 编译没有什么好说的了
  
  javac HelloWorld.java
  
  3) 生成扩展名为h的头文件
  
  javah ?jni HelloWorld
  
  头文件的内容:
  /* DO NOT EDIT THIS FILE - it is machine generated */
  #include <jni.h>
  /* Header for class HelloWorld */
  
  #ifndef _Included_HelloWorld
  #define _Included_HelloWorld
  #ifdef __cplusplus
  extern "C" {
  #endif
  /*
  * Class:   HelloWorld
  * Method:  displayHelloWorld
  * Signature: ()V
   */
  JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld
   (JNIEnv *, jobject);
  
  #ifdef __cplusplus
  }
  #endif
   #endif
  
  (这里我们可以这样理解:这个h文件相当于我们在java里面的接口,这里声明了一个 Java_HelloWorld_displayHelloWorld (JNIEnv *, jobject);方法,然后在我们的本地方法里面实现这个方法,也就是说我们在编写C/C++程序的时候所使用的方法名必须和这里的一致)。
   
  4) 编写本地方法
  
  实现和由javah命令生成的头文件里面声明的方法名相同的方法。
  
  代 码2:
  
  1 #include <jni.h>
  2 #include "HelloWorld.h"
   3 #include <stdio.h>
  4 JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj)
  {
   printf("Hello world!\n");
  return;
  }
  
  注意代码2中的第1行,需要将 jni.h(该文件可以在%JAVA_HOME%/include文件夹下面找到)文件引入,因为在程序中的JNIEnv、jobject等类型都是在该 头文件中定义的;另外在第2行需要将HelloWorld.h头文件引入(我是这么理解的:相当于我们在编写java程序的时候,实现一个接口的话需要声 明才可以,这里就是将HelloWorld.h头文件里面声明的方法加以实现。当然不一定是这样)。然后保存为HelloWorldImpl.c就ok 了。
  
  5) 生成动态库
  
  这里以在Windows 中为例,需要生 成dll文件。在保存HelloWorldImpl.c文件夹下面,使用VC的编译器cl成。
  
  cl -I%java_home%\include -I%java_home%\include\win32 -LD HelloWorldImp.c -Fehello.dll
  
  注意:生成的dll文件名在选项-Fe后面配置,这里是hello,因为在 HelloWorld.java文件中我们loadLibary的时候使用的名字是hello。当然这里修改之后那里也需要修改。另外需要将 -I%java_home%\include -I%java_home%\include\win32参数加上,因为在第四步里面编写本地方法的时候引入了jni.h文件。
  
   6) 运行程序
  
  java HelloWorld就ok。^_^

分享到:
评论

相关推荐

    JNI java本地接口实例

    一个简单的java 通过本地接口调用c++接口的实例 一看就会 很容易上手

    Java本地接口(JNI)编程指南和规范.pdf

    Java本地接口(JNI)编程指南和规范.pdf

    使用JNI调用本地接口(解决中文问题)

    使用JNI与本地接口,并传递中文字符串。 绝对原创,转载请说明!

    Java本地接口(JNI)编程指南和规范

    Java本地接口(JNI)编程指南和规范英文版翻译

    Java本地接口工作方式初探

    Java本地接口(Java Native Interface (JNI))允许运行在Java虚拟机(Java Virtual Machine (JVM))上的代码调用本地程序和类库,或者被它们调用,这些程序和类库可以是其它语言编写的,比如C、C++或者汇编语言。...

    JNI和java的相关知识

    了解jni java本地接口的相关知识以及与其相关的其他内容

    Java本地接口规范.pdf

    Java本地接口规范 中文版 自己在做jni时经常参考这个

    Java本地接口(JNI)编程指南和规范2

    Java本地接口(JNI)编程指南和规范2

    java的JNI本地调用

    JNI(java native interface)java本地接口,主要为了是实现java对本地函数的调用, 通过调用本地的库文件的内部方法,使JAVA可以实现和本地机器的紧密联系,调用系统级的各接口方法。

    Java 本地接口(JNI)编程指南和规范

    这本书涉及了"Java"本地接口(JNI) JNI 编程可以使用这个规范当作参考 说明书

    Java本地接口(JNI)编程指南和规范 Java Native Interface 6.0 Specification

    Java Native Interface Specification (JNI)编程指南和规范 pdf版

    Android下如何通过JNI方法向上提供接口总结

    JNI是Java Native Interface的缩写,即Java本地接口.从Java1.1开始,JNI标准成为Java平台的一部分,它允许java代码和用其它语言编写的代码进行交互.JNI是本地编程接口,它使得在Java虚拟机(VM)内部运行的Java代码能够...

    JNI 接口简介与实现 pdf.rar

    JNI 简介与实现.pdf,JNI是Java本地接口,是为Java编写本地方法和嵌入本地应用程序的标准的应用程序接口,这个小教程主要说明什么是JNI,以及它所需的环境和具体实现方法,生成动态链接库等内容。

    详解Java 本地接口 JNI 使用方法

    主要介绍了详解Java 本地接口 JNI 使用方法的相关资料,希望通过本文大家能彻底使用JNI编程,需要的朋友可以参考下

    java本地方法接口

    C语言可以实现更多的底层功能,java的平台无关性使其可以移植到更多的平台上,JNI方法可以可以实现两者之间的通信

    JNI规范,c和java的融合接口

    JNI是Java Native Interface的缩写,中文为JAVA本地调用。从Java1.1开始,Java Native Interface(JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是...

    Java JNI完全手册

     JAVA通过JNI调用本地方法,而本地方法是以库文件的形式存放的(在WINDOWS平台上是DLL文件形式,在UNIX机器上是SO文件形式)。通过调用本地的库文件的内部方法,使JAVA可以实现和本地机器的紧密联系,调用系统级的...

    Java本地接口JNI使用详解

    所以java提供了一些本地接口,他主要的作用是提供一个标准的方式让java程序通过虚拟机与原生代码进行交互,这也是我们平常常说的java本地接口(JNI——java native Interface)。它使得在 Java 虚拟机(VM) 内部运行...

    通熟易懂的JNI教材.ppt

    JNI是Java Native Interface的缩写,通过使用 Java本地接口书写程序,可以确保代码在不同的平台上方便移植。 从Java1.1开始,JNI标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是...

Global site tag (gtag.js) - Google Analytics