码迷,mamicode.com
首页 > 其他好文 > 详细

JNI的静态注册

时间:2015-10-31 18:42:20      阅读:184      评论:0      收藏:0      [点我收藏+]

标签:include   linux   关键字   c语言   java   

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

JNI的静态注册

标签:include   linux   关键字   c语言   java   

原文地址:http://6745396.blog.51cto.com/6735396/1708358

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!