当前位置:首页 > 嵌入式培训 > 嵌入式学习 > 讲师博文 > JNI开发原理及实例

JNI开发原理及实例 时间:2018-09-29      来源:未知

JNI(Java Native Interface)是指Java平台和本地C代码进行相互操作的API接口,称为Java本地代码接口。当Java程序需要访问系统的各个特性和设备时,或者一些要求效率和速度的场合时,此时应该采用JNI调用本地C或C++代码,来完成。如下图所示:

图一  JNI模型图

关于JNI函数的注册可以分为静态注册和动态注册。本文主要讲解静态注册之Java调用C语言,具体步骤如图二所示:

1)在java类中使用native声明一个本地方法,使用javac命令编译java类

2)运行javah获得头文件,包括这个本地方法的声明格式

3)用C实现本地方法

4)生成.so文件,并将其放入到共享类库中

5)在java文件中加载该类库,调用本地方法。

图二  JNI开发步骤图

具体实例演示如下所示:

(一) 首先创建MyJNI.java类,在本类中使用native生命一个方法cSayHello(),代码如下所示:

package com.farsight.demo;

public class MyJNI

{

public static native void cSayHello();

}

在Linux环境下,进入到java类所在目录,例如MyJNI.java存储在Desktop目录里,执行命令如下:

编译MyJNI.java文件,执行之后在Desktop目录里可以看到文件夹com/farsight/demo里的MyJNI.class文件。执行命令如下:

(二) 执行javah命令,生成.h文件。执行命令如下:

执行之后,可以看到在Desktop目录下新生成的com_farsight_demo_MyJNI.h文件,该文件中自动生成,无需修改。代码中JNIEXPORT后面就是我们在C语言里需要实现的方法。代码如下所示:

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

#include <jni.h>

/* Header for class com_farsight_demo_MyJNI */

 

#ifndef _Included_com_farsight_demo_MyJNI

#define _Included_com_farsight_demo_MyJNI

#ifdef __cplusplus

extern "C" {

#endif

/*

 * Class:     com_farsight_demo_MyJNI

 * Method:    cSayHello

 * Signature: ()V

 */

JNIEXPORT void JNICALL Java_com_farsight_demo_MyJNI_cSayHello

   (JNIEnv *, jclass);

 

#ifdef __cplusplus

}

#endif

#endif

 

(三) 用C实现本地方法,在方法中输出一句话。MyJNI.c代码如下:

#include "com_farsight_demo_MyJNI.h"

#include <jni.h>

#include <stdio.h>

 

J NIEXPORT void JNICALL Java_com_farsight_demo_MyJNI_cSayHello(JNIEnv * env ,jclass cl)

{

printf("hello in c called by java");

}

(四) 生成.so文件,并将其放入到共享类库中。执行之后可以看到新生成的libMyJNI.so文件。执行代码如下:

(五) 在java测试文件中加载该类库,调用本地方法。MyJNITest.java代码如下:

import com.farsight.demo.MyJNI;

public class MyJNITest

{

public static void main(String args[])

{

MyJNI.cSayHello();

}

 

static

{

System.loadLibrary("MyJNI");

}

}

编译并运行MyJNITest.java文件,执行之后可以看到在MyJNI.c文件中输出的一句话。执行代码如下所示:

上一篇:Linux 的多线程编程的几点注意事项

下一篇:select、pselect和poll函数的区别及用法

热点文章推荐
华清学员就业榜单
高薪学员经验分享
热点新闻推荐
前台专线:010-82525158 企业培训洽谈专线:010-82525379 院校合作洽谈专线:010-82525379 Copyright © 2004-2022 北京华清远见科技集团有限公司 版权所有 ,京ICP备16055225号-5京公海网安备11010802025203号

回到顶部