Board logo

标题: JNI java本地接口 [打印本页]

作者: qingqing3721    时间: 2011-5-15 14:16     标题: JNI java本地接口

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
  ?ㄕ饫镂颐强梢哉庋?斫猓赫飧鰄文件相当于我们在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。文章由 suyin.tk 口碑最好的缩阴产品 整理,收集辛苦,希望能保留出处。




欢迎光临 编程开发论坛 (http://bbs.lihuasoft.net/) Powered by Discuz! 6.0.0