1.静态注册方法
步骤:定义本地方法 ---》生成头文件----》c实现本地方法----》生成共享库----》java加载共享库-----》调用本地方法
——————————————————————
--------------------------------------------
1.首先在一个类中,生成一个包,并定义一个本地方法,本地方法用native关键字修饰。
执行:因为有装包行为,所以编译为: javac -d . xxx.java
// 此处的点为包是在当前目录生成
2.将拥有本地方法的java文件生成一个.h头文件,供本地语言调用(C/C++)
执行(包名.类名):javac com.cn.test.类名; (此处的类名为:定义本地方法的类名);
产物:com_cn_test_myjni.h
3.在C语言中加载此头文件,实现本地方法,将所得到的C文件生成一个.so共享库,供java调用;
#include “xxx.h”
执行:gcc -fPIC -I /home/linux/myjava/jdk1.6.0_07/include/ -I /home/linux/myjava/jdk1.6.0_07/include/linux/ -shared -o libxxx.so ./MyJNI.c
注:xxx.so 为你生成的共享库名字;./MyJNI.c 为当前目录下的C文件
//-fPIC:产物是位置无关
// -I:头文件位置
//-shared:产物是共享库
//-o:指定产物的名
//libMyJNI.so:产物的名
//./MyJNI.c:源程序
/jni.h搜索: find ./ -name "jni.h" -->/home/linux/myjava/jdk1.6.0_07/include/
//jni_md.h搜索:find ./ -name "jni_md.h" -->/home/linux/myjava/jdk1.6.0_07/include/linux/
4.调用本地方法
java文件中加载共享库
调用本地方法
执行:
java -Djava.library.path=. MyJNITest
注:. 表示当前路径
**************************************************
**************************************************
实例代码:
1:定义本地方法
MyJni.java
----------------------------------------------
package my.test;:
public class testNative{
public static native void cfun();
}
----------------------------------------------
2.生成头文件
执行:javah com.cn.rcm.MyJNI; (com.cn.rcm.MyJNI:有native方法的类的路径)
产物:com_cn_rcm_MyJNI.h
内容:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_cn_rcm_MyJNI */
#ifndef _Included_com_cn_rcm_MyJNI
#define _Included_com_cn_rcm_MyJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_cn_rcm_MyJNI
* Method: cSayHello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_cn_rcm_MyJNI_cSayHello
(JNIEnv *, jclass);//函数声明
//和MyJNI 的本地的方法联系,实现此方法就相当于实现java的native方法。
//java 的 native 方法: public native void cSayHello();
//c的本地的方法的声明:JNIEXPORT void JNICALL Java_com_cn_rcm_MyJNI_cSayHello(JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif
------------------------------------------------------------------------
3:实现本地方法,生成共享库
#include<stdio.h>
#include "com_cn_rcm_MyJNI.h"
JNIEXPORT void JNICALL Java_com_cn_rcm_MyJNI_cSayHello(JNIEnv *env, jclass jcl){
int i = 0, j = 0;
for(i = 2; i <= 100; i++){
for(j = 2; j < i; j++){
if(i % j == 0){
break;
}
}
if(i == j){
printf("res : %d\n", i);
}
}
}
编译:
gcc -fPIC -I /home/linux/myjava/jdk1.6.0_07/include/ -I /home/linux/myjava/jdk1.6.0_07/include/linux/ -shared -o libMyJNI.so ./MyJNI.c
——————————————————————————————————————
4:加载共享库,调用本地方法
MyJNITest.java:
import com.cn.rcm.MyJNI;
public class MyJNITest{
public static void main(String args[]){
MyJNI.cSayHello(); //MyJNI的本地方法。实现在libMyJNI.so内
}
static{
//通过static的游离块加载底层的so共享文件。
System.loadLibrary("MyJNI"); //lib MyJNI .so
}
}
}
编译:javac MyJNITest.java
执行:java -Djava.library.path=. MyJNITest
得到本地方法的输出数据
------------------------------------------------------------------------------------
本文出自 “java学习录” 博客,请务必保留此出处http://6745396.blog.51cto.com/6735396/1708358
原文地址:http://6745396.blog.51cto.com/6735396/1708358