JNI使用范例

1. JNI (Java Native Interface)Java本地接口
2. native
关键字:使用native所修饰的方法为本地方法,该方法只有声明,没有实现,表示该实现是由c/c++来提供的。 
3. jni
本质上就是java代码来调用动态链接库的过程(在Windows上,动态链接库就是一个dll文件,在Linux上,动态链接库是一个so文件,如果在Linux上,那么调用的动态链接库文件名必须以lib开始) 

4、实例

java程序调用HelloWorld.dll的C++动态链接库

  1. package com.alibaba.demo.jni; 
  2.  
  3. public class JniDemo { 
  4.     static
  5.         //不能加后缀, windows上面后缀为dll;在linux下为so,且必须以lib开头 
  6.         System.loadLibrary("HelloWorld"); 
  7.     } 
  8.     public native void output(); 
  9.      
  10.     public static void main(String[] args) { 
  11.         JniDemo jni = new JniDemo(); 
  12.         jni.output(); 
  13.     } 

 步骤1:先编译java -d . JniDemo.java

步骤2:使用javah命令生产c++的头文件:com_alibaba_demo_jni_JniDemo.h

javah com.alibaba.demo.jni.JniDemo,生产的头文件的代码如下:

  1. /* DO NOT EDIT THIS FILE - it is machine generated */ 
  2. #include <jni.h> 
  3. /* Header for class com_alibaba_demo_jni_JniDemo */ 
  4.  
  5. #ifndef _Included_com_alibaba_demo_jni_JniDemo 
  6. #define _Included_com_alibaba_demo_jni_JniDemo 
  7. #ifdef __cplusplus 
  8. extern "C" { 
  9. #endif 
  10. /* 
  11.  * Class:     com_alibaba_demo_jni_JniDemo 
  12.  * Method:    output 
  13.  * Signature: ()V 
  14.  */ 
  15. JNIEXPORT void JNICALL Java_com_alibaba_demo_jni_JniDemo_output 
  16.   (JNIEnv *, jobject); 
  17.  
  18. #ifdef __cplusplus 
  19. #endif 
  20. #endif 

步骤3:在C++中实现方法

除了引入自己的头文件外,还必须引入Java\jdk1.6.0_18\include\jni.h,在32位的环境下还需要引入Java\jdk1.6.0_18\include\win32\jni_md.h

  1. JNIEXPORT void JNICALL Java_com_alibaba_demo_jni_JniDemo_output  (JNIEnv *, jobject) 
  2.   printf("Hello World JNI!\n"); 

将编译完成的dll文件修改为HelloWorld.dll,并放入到classpath下面

步骤4:使用java com.alibaba.demo.jni.JniDemo执行程序,则此时打印出:Hello World JNI! 

基本任务完成