`
leo1211
  • 浏览: 140961 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JNI完全手册

阅读更多
  JAVA以其跨平台的特性深受人们喜爱,而又正由于它的跨平台的目的,使得它和本地机器的各种内部联系变得很少,约束了它的功能。解决JAVA对本地操作的一种方法就是JNI。   JAVA通过JNI调用本地方法,而本地方法是以库文件的形式存放的(在WINDOWS平台上是DLL文件形式,在UNIX机器上是SO文件形式)。通过调用本地的库文件的内部方法,使JAVA可以实现和本地机器的紧密联系,调用系统级的各接口方法。   
简单介绍及应用如下:  
一、JAVA中所需要做的工作   
  在JAVA程序中,首先需要在类中声明所调用的库名称,如下:   
static {   System.loadLibrary(“goodluck”);   }   
  在这里,库的扩展名字可以不用写出来,究竟是DLL还是SO,由系统自己判断。 还需要对将要调用的方法做本地声明,关键字为native。并且只需要声明,而不需要具 体实现。如下:   
public native static void set(int i);   
public native static int get();   
然后编译该JAVA程序文件,生成CLASS,再用JAVAH命令,JNI就会生成C/C++的头文件。 例如程序testdll.java,内容为:   
public class testdll   {   
  static   {   System.loadLibrary("goodluck");   }   
  public native static int get();   
  public native static void set(int i);   
  public static void main(String[] args)   {   
    testdll test = new testdll();   test.set(10);
   System.out.println(test.get());   
  }   
}
  
用javac testdll.java编译它,会生成testdll.class。 再用javah testdll,则会在当前目录下生成testdll.h文件,这个文件需要被C/C++程序调用来生成所需的库文件。

二、C/C++中所需要做的工作   
对于已生成的.h头文件,C/C++所需要做的,就是把它的各个方法具体的实现。然后编译连接成库文件即可。再把库文件拷贝到JAVA程序的路径下面,就可以用JAVA调用C/C++所实现的功能了。 接上例子。我们先看一下testdll.h文件的内容:   
/* DO NOT EDIT THIS FILE - it is machine generated */
  #include
  /* Header for class testdll */
  #ifndef _Included_testdll
  #define _Included_testdll
  #ifdef __cplusplus
  extern "C" {
  #endif
  /*
  * Class: testdll
  * Method: get
  * Signature: ()I
  */
  JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass);
  /*
  * Class: testdll
  * Method: set
  * Signature: (I)V
  */
  JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint);
  #ifdef __cplusplus
  }
  #endif
  #endif   
在具体实现的时候,我们只关心两个函数原型   
JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass); 和   JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint);   这里JNIEXPORT和JNICALL都是JNI的关键字,表示此函数是要被JNI调用的。而jint是以JNI为中介使JAVA的int类型与本地的int沟通的一种类型,我们可以视而不见,就当做int使用。函数的名称是JAVA_再加上java程序的package路径再加函数名组成的。参数中,我们也只需要关心在JAVA程序中存在的参数,至于JNIEnv*和jclass我们一般没有必要去碰它。 好,下面我们用testdll.cpp文件具体实现这两个函数:   #include "testdll.h"
  int i = 0;
  JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass)
  {
  return i;
  }
  JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint j)
  {
  i = j;
  }   
编译连接成库文件,本例是在WINDOWS下做的,生成的是DLL文件。并且名称要与JAVA中需要调用的一致,这里就是goodluck.dll 。把goodluck.dll拷贝到testdll.class的目录下,java testdll运行它,就可以观察到结果了。
推荐网址:
http://www.matrix.org.cn/resource/article/2008-10-29/16301a5a-a584-11dd-9ec1-71d7264eb72f.html

http://www.javaworld.com/javaworld/jw-02-2008/jw-02-opensourcejava-jna.html?page=1   
分享到:
评论

相关推荐

    JNI完全手册.doc

    本手册将深入探讨JNI的使用和原理。 首先,要在Java程序中使用JNI,需要在Java类中声明要调用的本地库,并对将调用的方法进行本地声明。如示例所示,声明加载库的代码是: ```java static { System.loadLibrary(...

    JNI 完全手册中文版.pdf

    Java本地接口(JNI)是一个用于Java语言编程的应用程序接口(API),它允许Java代码在Java虚拟机(JVM)中运行时,与用C、C++或汇编等其他编程语言编写的应用程序或库进行交互。JNI对于Android开发人员而言尤为重要...

    JNI完全技术手册 带完整书签

    Chap1:JNI完全手册... 3 Chap2:JNI-百度百科... 11 Chap 3:javah命令帮助信息... 16 Chap 4:用javah产生一个.h文件... 17 Chap5:jni教程(very very good) 19 Chap6: JNI传递返回值... 26 15.2.2.3 传递字符...

    JNI完全手册资料

    JNI完全手册资料

    Java JNI完全手册

    Java 本地接口(Java Native Interface,JNI)是Java平台的一部分,允许Java代码和其他语言写的代码进行交互。JNI自Java 1.1引入以来,已经成为在Java应用程序中集成C/C++代码的标准方式,尤其是在处理高性能计算、...

    JNI-API完全手册.rar

    本手册的"JNI-API完全手册.doc"文件,很可能是详细列出了所有这些概念和API的使用方法,包括每个函数的参数、返回值、注意事项和示例代码。通过学习这份文档,开发者可以深入理解JNI的工作原理,熟练运用JNI来解决...

    JNI-APIsss完全手册.doc

    Java 本地接口(JNI,Java Native Interface)是Java平台中用于连接Java代码和本地(非Java)代码的桥梁。JNI允许Java程序调用其他编程语言(如C、C++、汇编等)编写的函数,同时也让本地代码能够调用Java类的方法。...

    JNI 完全技术手册

    ### JNI 完全手册知识点: #### 1. JNI 定义与设计目的 JNI定义了Java和本地应用之间交互的接口,它允许Java代码调用本地应用程序接口(如C/C++),反之亦然。这种设计的目的主要是为了: - 允许Java代码访问系统...

    JNI中文手册

    在阅读《JNI完全手册》这本书时,开发者应重点理解和实践这些知识点,以便在需要将Java与其他语言结合,或者需要提升性能的场合,能够有效地运用JNI技术。同时,了解JNI也有助于深入理解Java平台的工作机制,对于...

    JNI完全技术手册

    JNI手册,介绍JNI的使用 android JNI框架的搭建。

    JNI完全数据手册

    JNI完全数据手册,方便Android开发者阅读,下载看下,应该是用得上。

Global site tag (gtag.js) - Google Analytics