简单JNI实例
来源:互联网 发布:网络主播文儿的歌曲 编辑:程序博客网 时间:2024/04/26 17:20
简单JNI实例笔记
1、用到的命令:
javac,javah,java和gcc
javac将java文件编译生成.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、源码解析
1、System.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 4月1414:38 localdata.c
-rw-r--r--1 drjiang drjiang 1002 4月1415:31 testlocaldata.class
-rw-r--r--1 drjiang drjiang 577 4月1414: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 4月1414:38 localdata.c
-rw-r--r--1 drjiang drjiang 1002 4月1415:31 testlocaldata.class
-rw-r--r--1 drjiang drjiang 570 4月1415:39 testlocaldata.h
-rw-r--r--1 drjiang drjiang 577 4月1414: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 4月1414:38 localdata.c
-rw-r--r--1 drjiang drjiang 1002 4月1415:31 testlocaldata.class
-rw-r--r--1 drjiang drjiang 570 4月1415:39 testlocaldata.h
-rw-r--r--1 drjiang drjiang 577 4月1414: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 4月1415:52 liblocaldata.so
-rw-r--r--1 drjiang drjiang 457 4月1414:38 localdata.c
-rw-r--r--1 drjiang drjiang 1002 4月1415:31 testlocaldata.class
-rw-r--r--1 drjiang drjiang 570 4月1415:39 testlocaldata.h
-rw-r--r--1 drjiang drjiang 577 4月1414: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.
- Android JNI简单实例
- JNI简单实例
- 简单JNI实例
- JNI简单入门实例
- JNI简单实例
- jni简单实例
- Android JNI简单实例
- 简单JNI实例
- JNI介绍及简单实例
- Android---简单的JNI实例
- Android---简单的JNI实例
- AndroidStudio NDK-JNI简单实例
- JNI调用简单实例解析
- JNI的一个简单实例
- Android下的JNI简单实例HelloWorld
- linux上简单的JNI入门实例
- Android--JNI简单的实例解析
- Android—JNI调用简单实例解析
- 安卓 再按一次退出
- 数据库死锁
- HDU - 3465 Life is a Line
- PDO 与 MYSQL Replace 的细节
- Unity3D 错误,nativeVideoFrameCallback解决方法。
- 简单JNI实例
- shellcode 之 栈溢出
- Siebel 发邮件Marketing Approval Process
- 关于chukwa的一些疑问
- Oracle估算表大小的小方法
- JSON.stringify 语法实例讲解
- Maven3路程(六)用Maven创建Spring3 MVC项目
- leetcode: Validate Binary Search Tree
- 浅谈HTTP中Get与Post的区别