JNI学习笔记

来源:互联网 发布:万国数据是外企吗 编辑:程序博客网 时间:2024/06/05 02:09

JNI学习笔记

JNI允许java调用本地方法,这种能力真的是让人灰常灰常的激动呢。。下面就来看如何实现吧。
我想要调用c语言,编写一个函数,返回数组的和。


第一步:编写java代码

新建MMathTool.java,代码如下:

public class MMathTool {    private static String FILE_NAME="";    static{        System.load(FILE_NAME);    }    public native int sum(int nums[], int n);    public static void main(String[] args){        int[] nums={1,2,3,4};        System.out.println(new MMathTool().sum(nums));    }}

第二步:编译java相关文件

-1.在命令行中将.java文件编译为.class文件
(要先切换到相应目录哦)
javac MMathTool.java
-2.使用javah生成C语言头文件
javah -jni MMathTool
可以看到头文件内容如下:

/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class MMathTool */#ifndef _Included_MMathTool#define _Included_MMathTool#ifdef __cplusplusextern "C" {#endif/* * Class:     MMathTool * Method:    sum * Signature: ([II)I */JNIEXPORT jint JNICALL Java_MMathTool_sum  (JNIEnv *, jobject, jintArray, jint);#ifdef __cplusplus}#endif#endif

-3.编写CPP文件
编写当中,注意在函数中加入形参
代码如下:

#include <jni.h>#include "MMathTool.h"JNIEXPORT jint JNICALL Java_MMathTool_sum  (JNIEnv *env, jobject obj, jintArray nums)  {    int sum=0;    jsize len=(*env)->GetArrayLength(env, nums);    jint *a=(*env)->GetIntArrayElements(env, nums, 0);    for(int i=0;i<len;i++)    {        sum+=a[i];    }    (*env)->ReleaseIntArrayElements(env, nums, a, 0);    return sum;  }

-4.将编写的cpp文件编译为.dll文件
这个过程中有几点需要注意:
:编译器和JVM的位数要相同。比如说gcc编译器是64位,那么JVM也要是64位才可以运行。否则就会报错。
: 查看代码可以发现,引用了 jni.h,jni_md.h 库,那么在编译的时候需要链接
gcc -shared -I "C:\Program Files\Java\jdk1.7.0_67\include" -I "C:\Program Files\Java\jdk1.7.0_67\include\win32" MMathTool.cpp -o libMMathTool.lib
编译出dll文件后,因为java程序中System.loadLibrary("libMMathTool"),需要将其放到java相应的lib中。例如,可以放到C:\Program Files\Java\jdk1.7.0_67\lib中。
- 5.运行.class
java MMathTool
可以看到程序输出结果
6
Well done!
附上百度网盘链接http://pan.baidu.com/s/1sj03DE1

0 0
原创粉丝点击