Linux下JNI调用简单实例操作全过程


开发环境:Linux(Ubuntu 11.04) + JDK 7
实例说明:利用JNI调用本地代码的方法来实现一个计算Int数组总和的功能

使用JNI调用本地代码,整个开发流程主要包括以下几个步骤:
1、创建一个Java类(IntArray.java);
2、使用javac编译该类(生成IntArray.class);
3、使用javah -jni 产生头文件(生成IntArray.h);
4、使用本地代码实现头文件中定义的方法(编写IntArray.c);
5、编译生成本地动态库(生成libIntArray.so);
6、使用Java运行程序。

一、创建一个Java类(IntArray.java)
  1. class IntArray{  
  2.     private native int sumArray(int[] arr);  
  3.     public static void main(String[]args){  
  4.         IntArray p = new IntArray();  
  5.         int arr[] = new int[10];  
  6.         for(int i =0;i<10;i++){  
  7.             arr[i] = i;  
  8.         }  
  9.   
  10.         int sum = p.sumArray(arr);  
  11.         System.out.println("Sum = "+sum);  
  12.     }  
  13.   
  14.     static{  
  15.         System.loadLibrary("IntArray");  
  16.         }  
  17. }  
注:
     1、在Java代码中声明本地方法必须有"native"标识符,native修饰的方法,在Java代码中只作为声明存在。例如: private native int sumArray(int[] arr);
     2、在调用本地方法前,必须首先装载含有该方法的本地库. 如IntArray.java中所示,置于static块中,在Java VM初始化一个类时,首先执行这部分代码,这可保证调用本地方法前,装载了本地库。
  1. static{  
  2.     System.loadLibrary("IntArray");  
  3.     }  
二、使用javac编译该类(生成IntArray.class)
  1. javac IntArray.java  
三、使用javah -jni 产生头文件(生成IntArray.h)
  1. javah -jni IntArray  
生成IntArray.h  
  1. /* DO NOT EDIT THIS FILE - it is machine generated */  
  2. #include <jni.h>   
  3. /* Header for class IntArray */  
  4.   
  5. #ifndef _Included_IntArray   
  6. #define _Included_IntArray   
  7. #ifdef __cplusplus   
  8. extern "C" {  
  9. #endif   
  10. /* 
  11.  * Class:     IntArray 
  12.  * Method:    sumArray 
  13.  * Signature: ([I)I 
  14.  */  
  15. JNIEXPORT jint JNICALL Java_IntArray_sumArray  
  16.   (JNIEnv *, jobject, jintArray);  
  17.   
  18. #ifdef __cplusplus   
  19. }  
  20. #endif   
  21. #endif  
四、使用本地代码实现头文件中定义的方法(编写IntArray.c)
复制IntArray.h成IntArray.c,对于IntArray.c做以下修改:
1、添加头文件:#include "IntArray.h"
2、去掉以下几句
#ifndef _Included_IntArray
#define _Included_IntArray
#endif
3、实现头文件中定义的方法

IntArray.c具体代码如下:
  1. /* DO NOT EDIT THIS FILE - it is machine generated */  
  2. #include <jni.h>   
  3. /* Header for class IntArray */  
  4. #include "IntArray.h"   
  5.   
  6. #ifdef __cplusplus   
  7. extern "C" {  
  8. #endif   
  9. /* 
  10.  * Class:     IntArray 
  11.  * Method:    sumArray 
  12.  * Signature: ([I)I 
  13.  */  
  14. JNIEXPORT jint JNICALL Java_IntArray_sumArray  
  15.   (JNIEnv *env, jobject obj, jintArray arr)  
  16. {  
  17.     jint buf[10] ={0};  
  18.     jint i = 0,sum = 0;  
  19.       
  20.     (*env)->GetIntArrayRegion(env,arr,0,10,buf);  
  21.       
  22.     for(i=0;i<10;i++)  
  23.     {  
  24.         sum += buf[i];  
  25.     }  
  26.       
  27.     return sum;  
  28. }  
  29. #ifdef __cplusplus   
  30. }  
  31. #endif  
  • 1
  • 2
  • 下一页

相关内容