简单JNI实例

来源:互联网 发布:网络主播文儿的歌曲 编辑:程序博客网 时间:2024/04/26 17:20

简单JNI实例笔记

1、用到的命令:

javac,javah,javagcc

javacjava文件编译生成.class文件。

javah.class文件中提取出本地函数申明,生成.h文件。

gcc生成本地库

java执行.class文件。

2、环境准备

1、配置JDK环境变量,如下:

exportJAVA_HOME=/home/drjiang/jdk1.6.0_45

exportJRE_HOME=$JAVA_HOME/jre

exportCLASSPATH=$JAVA_HOME/lib:.:$JRE_HOME/lib:$CLASSPATH

exportPATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH


3、用文本编辑工具或eclipse等工具,生成Java源码文件

publicclass testlocaldata

{

static

{

System.loadLibrary("localdata");

}

publicnative static int getlocaldata();

publicnative static void setlocaldata(int localData);

publicstatic void main(String[] args)

{

testlocaldatalocalData = new testlocaldata();

System.out.println(System.getProperty("java.library.path"));

System.out.println("ThelocalData is "+localData.getlocaldata()+".");

localData.setlocaldata(10);

System.out.println("ThelocalData is "+localData.getlocaldata()+".");

}

}


1、源码解析

1System.loadLibrary("localdata");

加载localdata动态库,文件系统中的实际动态库文件名是liblocaldata.so。注意:一定加上lib.so。否则,加载会报错。liblocaldata.so存放路径必须是该属性”java.library.path”中存在的路径,否则,加载过程中找不到它。

2、声明本地方法,关键字为native。如下:

publicnative static int getlocaldata();

publicnative static void setlocaldata(int localData);

4、编译java源文件,生成.class文件。

drjiang@drjiang:~/work/jni/testjni$ls

localdata.c testlocaldata.java

drjiang@drjiang:~/work/jni/testjni$javac testlocaldata.java

drjiang@drjiang:~/work/jni/testjni$ls -l

总用量12

-rw-r--r--1 drjiang drjiang 457 41414:38 localdata.c

-rw-r--r--1 drjiang drjiang 1002 41415:31 testlocaldata.class

-rw-r--r--1 drjiang drjiang 577 41414:40 testlocaldata.java

drjiang@drjiang:~/work/jni/testjni$


5、从.class文件中,提取本地方法,生成jni头文件

1、命令详解

drjiang@drjiang:~/work/jni/testjni$javah -help

用法:javah[选项]<>

其中[选项]包括:

-help输出此帮助消息并退出

-classpath<路径>用于装入类的路径

-bootclasspath<路径>用于装入引导类的路径

-d<目录>输出目录

-o<文件>输出文件(只能使用 -d-o中的一个)

-jni生成 JNI样式的头文件(默认)

-version输出版本信息

-verbose启用详细输出

-force始终写入输出文件

使用全限定名称指定<>(例

如,java.lang.Object)。


2、生成头文件

drjiang@drjiang:~/work/jni/testjni$javah -jni testlocaldata

drjiang@drjiang:~/work/jni/testjni$ls -l

总用量16

-rw-r--r--1 drjiang drjiang 457 41414:38 localdata.c

-rw-r--r--1 drjiang drjiang 1002 41415:31 testlocaldata.class

-rw-r--r--1 drjiang drjiang 570 41415:39 testlocaldata.h

-rw-r--r--1 drjiang drjiang 577 41414:40 testlocaldata.java

drjiang@drjiang:~/work/jni/testjni$

3、头文件内容

/*DO NOT EDIT THIS FILE - it is machine generated */

#include<jni.h>

/*Header for class testlocaldata */

#ifndef_Included_testlocaldata

#define_Included_testlocaldata

#ifdef__cplusplus

extern"C" {

#endif

/*

* Class: testlocaldata

* Method: getlocaldata

* Signature: ()I

*/

JNIEXPORTjint JNICALL Java_testlocaldata_getlocaldata

(JNIEnv *, jclass);

/*

* Class: testlocaldata

* Method: setlocaldata

* Signature: (I)V

*/

JNIEXPORTvoid JNICALL Java_testlocaldata_setlocaldata

(JNIEnv *, jclass, jint);

#ifdef__cplusplus

}

#endif

#endif


6、编辑本地库源码文件

#include"testlocaldata.h"

intgiLocalData = 0;

/*

* Class: testlocaldata

* Method: getlocaldata

*Signature: ()I

*/

JNIEXPORTjint JNICALL Java_testlocaldata_getlocaldata(JNIEnv * pJNIEnv,jclass cClass)

{

return giLocalData;

}

/*

* Class: testlocaldata

* Method: setlocaldata

*Signature: (I)V

*/

JNIEXPORTvoid JNICALL Java_testlocaldata_setlocaldata(JNIEnv * pJNIEnv,jclass cClass, jint iPara)

{

giLocalData = iPara;

}



drjiang@drjiang:~/work/jni/testjni$ls -l

总用量16

-rw-r--r--1 drjiang drjiang 457 41414:38 localdata.c

-rw-r--r--1 drjiang drjiang 1002 41415:31 testlocaldata.class

-rw-r--r--1 drjiang drjiang 570 41415:39 testlocaldata.h

-rw-r--r--1 drjiang drjiang 577 41414:40 testlocaldata.java


7、生成本地动态库

drjiang@drjiang:~/work/jni/testjni$gcc -shared -fPIC -I /home/drjiang/jdk1.6.0_45/include -I/home/drjiang/jdk1.6.0_45/include/linux localdata.c -oliblocaldata.so

drjiang@drjiang:~/work/jni/testjni$ls -l

总用量24

-rwxr-xr-x1 drjiang drjiang 7979 41415:52 liblocaldata.so

-rw-r--r--1 drjiang drjiang 457 41414:38 localdata.c

-rw-r--r--1 drjiang drjiang 1002 41415:31 testlocaldata.class

-rw-r--r--1 drjiang drjiang 570 41415:39 testlocaldata.h

-rw-r--r--1 drjiang drjiang 577 41414:40 testlocaldata.java

drjiang@drjiang:~/work/jni/testjni$



8、执行程序

drjiang@drjiang:~/work/jni/testjni$java testlocaldata

/home/drjiang/jdk1.6.0_45/jre/lib/amd64/server:/home/drjiang/jdk1.6.0_45/jre/lib/amd64:/home/drjiang/jdk1.6.0_45/jre/../lib/amd64:.:..::/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib

ThelocalData is 0.

ThelocalData is 10.





0 0