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 (编辑:云计算网_泰州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |