Chinaunix首页 | 论坛 | 博客
  • 博客访问: 188346
  • 博文数量: 63
  • 博客积分: 725
  • 博客等级: 军士长
  • 技术积分: 375
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-12 19:55
文章分类

全部博文(63)

文章存档

2012年(35)

2011年(28)

分类:

2012-02-21 23:42:07


一、JNI概念
 
     JNI是Java Native Interface的缩写.
     设计目的是:标准JAVA库不支持一些平台特性,你可以用别的语言,编写代码使得
     你的软件支持这些平台特性,也可能你的程序需要用低级语言编写一些算法以提高程序的效率.
     JNI允许Java代码和其他语言写的代码进行交互。
 
二、JNI编程简介
   
    书写步骤:
    1、编写带有native 声明的java类;
    2、使用javac命令编译所编写的java类;
    3、使用javah -jni com.ikags.project.XXXX编译成扩展名为h的头文件;
    4、使用C/C++(或其他编程语言) 实现本地方法;
    5、将C/C++编写的文件生成动态连接库;
    6、将.dll(.so)文件提供给需要的项目,用system.loadLibrary方法调用;
 
三、JNI实例
   
    1、编写java程序
       这里以HelloWorld为例。
       代码1:
       class HelloWorld{
       public native void displayHelloWorld(); //声明一个native本地函数
       static{ 
       System.loadLibrary(hello);
       }
       }
 
          声明native方法:如果你想将一个方法作为一个本地方法的话,那么你就必须声明改
      方法为native的,并且不能实现。其中方法的参数和返回值在后面讲述,函数名
      displayHelloWorld要和后面C模块中的函数名对应。
          Load动态库:System.loadLibrary("hello");加载动态库(我们可以这样理解:我们的方
      法displayHelloWorld()没有实现,但是我们在下面就直接使用了,所以必须在使用之前对它进行
      初始化)这里一般是以static块进行加载的。同时需要注意的是System.loadLibrary();注意
      loadLibrary方法的参数不是"libhello.so",而是去掉前缀和后缀之后的"hello"。
   
    2、编译
          javac HelloWorld.java
 
    3、生成扩展名为h的头文件
          javah -jni HelloWorld
       头文件的内容:
       /*DO NOT EDIT THIS FILE-it is machine generated*/
       #include
       /*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:
       #include
       #include "HelloWorld.h"
       #include
       JNIEXPORT void JNICALL
       Java_HelloWorld_displayHelloWorld(JNIEnv *env,jobject obj)
       {
       printf("Hello world!\n");
       return;
       }
 
      注意代码2中的第一行,需要将jni.h(可以在%JAVA_HOME%/include/文件夹下找到)文件引入,因
      为在程序中的JNIEnv、jobject等类型都是在该头文件中定义的;另外在第2行需要将
      HelloWorld.h头文件引入(可以理解为:相当于在编写java程序的时候,实现一个接口的话,需要声
      明才可以,这里就是将HelloWorld.h头文件里面声明的方法加以实现)。然后保存为
      HelloWorldImpl.c就可以了。
 
    5、生成动态库
          编译HelloWorldImpl.c为动态库hello.so。
 
    6、允许程序
          java HelloWorld
 
四、常见文件
   
    1、java和c是如何互通的
       不能互通的原因注意是数据类型的问题,jni解决了这个问题,例如那个c文件中的jstring数据类型
       就是java传入的String对象,经过jni函数的转化就能成为c的char*。
 
 
 
 
 
 
 
 
 

 
阅读(655) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~