Linux下JNI调用简单实例操作全过程
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)
- class IntArray{
- private native int sumArray(int[] arr);
- public static void main(String[]args){
- IntArray p = new IntArray();
- int arr[] = new int[10];
- for(int i =0;i<10;i++){
- arr[i] = i;
- }
- int sum = p.sumArray(arr);
- System.out.println("Sum = "+sum);
- }
- static{
- System.loadLibrary("IntArray");
- }
- }
1、在Java代码中声明本地方法必须有"native"标识符,native修饰的方法,在Java代码中只作为声明存在。例如: private native int sumArray(int[] arr);
2、在调用本地方法前,必须首先装载含有该方法的本地库. 如IntArray.java中所示,置于static块中,在Java VM初始化一个类时,首先执行这部分代码,这可保证调用本地方法前,装载了本地库。
- static{
- System.loadLibrary("IntArray");
- }
- javac IntArray.java
- javah -jni IntArray
- /* DO NOT EDIT THIS FILE - it is machine generated */
- #include <jni.h>
- /* Header for class IntArray */
- #ifndef _Included_IntArray
- #define _Included_IntArray
- #ifdef __cplusplus
- extern "C" {
- #endif
- /*
- * Class: IntArray
- * Method: sumArray
- * Signature: ([I)I
- */
- JNIEXPORT jint JNICALL Java_IntArray_sumArray
- (JNIEnv *, jobject, jintArray);
- #ifdef __cplusplus
- }
- #endif
- #endif
复制IntArray.h成IntArray.c,对于IntArray.c做以下修改:
1、添加头文件:#include "IntArray.h"
2、去掉以下几句
#ifndef _Included_IntArray
#define _Included_IntArray
#endif
3、实现头文件中定义的方法
IntArray.c具体代码如下:
- /* DO NOT EDIT THIS FILE - it is machine generated */
- #include <jni.h>
- /* Header for class IntArray */
- #include "IntArray.h"
- #ifdef __cplusplus
- extern "C" {
- #endif
- /*
- * Class: IntArray
- * Method: sumArray
- * Signature: ([I)I
- */
- JNIEXPORT jint JNICALL Java_IntArray_sumArray
- (JNIEnv *env, jobject obj, jintArray arr)
- {
- jint buf[10] ={0};
- jint i = 0,sum = 0;
- (*env)->GetIntArrayRegion(env,arr,0,10,buf);
- for(i=0;i<10;i++)
- {
- sum += buf[i];
- }
- return sum;
- }
- #ifdef __cplusplus
- }
- #endif
|
评论暂时关闭