加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_泰州站长网 (http://www.0523zz.com/)- 视觉智能、AI应用、CDN、行业物联网、智能数字人!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

Linux下JNI调用简单实例操作全步骤

发布时间:2021-11-25 18:20:10 所属栏目:PHP教程 来源:互联网
导读:开发环境:Linux(Ubuntu 11.04) + JDK 7 实例说明:利用JNI调用本地代码的方法来实现一个计算Int数组总和的功能 使用JNI调用本地代码,整个开发流程主要包括以下几个步骤: 1、创建一个Java类(IntArray.java); 2、使用javac编译该类(生成IntArray.class

开发环境: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.class)
javac IntArray.java  
三、使用javah -jni 产生头文件(生成IntArray.h)
javah -jni IntArray  
生成IntArray.h
 
/* 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.c)
复制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  

(编辑:云计算网_泰州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读