当前位置: > 华清远见教育科技集团 > 嵌入式学习 > 讲师博文 > JNI静态注册之Java调C一
JNI静态注册之Java调C一
时间:2016-12-14作者:华清远见

一、 JNI 是什么?

JNI是Java Native Interface的缩写(Java本地调用)。

Java平台和本地C代码进行相互操作的API接口称为Java本地代码接口。

二、 JNI使用的场合

1.当应用程序需要访问系统的各个特性和设备,并且这些特性和设备通过Java平台是无法访问时。

2.在一些要求效率和速度的场合,本地代码的运行效率高,比如复杂数学运算,游戏上的3D效果等等。 需要Native语言实现时。

3.当某个模块功能,已经有了一个成熟的,且经过大量测试的N ative代码实现,并且知道如何将其移植到所使用的目标平台上时。

注意:在没有必要的场合尽量避免使用。然而在android中大量的使用了JNI技术来使用本地系统库和底层交互,Java虚拟机之所以屏蔽了平台间的差异,也因为使用了JNI。

三、 预备知识

熟话说、在一起就要在一起的样子。C为了和Java之间是实现相互调用。必须在C中定义对应于Java中的数据类型。于是有了:

1. 基本数据类型转换

2. 引用数据类型

四、 Java调用C中的代码

就是实现java层的方法和JNI层中的其兄弟之间,实现一种映射。这种映射包括两种:

静态、动态。下面我们接受静态映射。也可以说是JNI的静态注册。

4.1过程步骤:

◆ 1)在java中声明一个本地方法

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

◆ 3)用C实现本地方法

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

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

4.3代码

主程序MyJNITest调用MyJNI中的本地代码cSayHello方法

import com.farsight.demo.MyJNI;
        public class MyJNITest{
                public static void main(String args[]){
                        MyJNI.cSayHello();
                }
                static{
                        System.loadLibrary(“MyJNI”);
                }
        }

        package com.farsight.demo;
        class MyJNI{
                public static native void cSayHello();
        }

五、 操作步奏

命令行输入:

1.编译java源文件

javac -d . MyJNI.java

javac MyJNItest.java

2. 生成头文件并编写本地代码。

javah com.farsight.demo.MyJNI,得知C中兄弟(JNI方法格式)的摸样。

MyJNI.c
        #include “com_farsight_demo_MyJNI.h”
        #include <stdio.h>
        JNIEXPORT void JNICALL Java_com_farsight_demo_MyJNI_cSayHello(JNIEnv * env ,jclass cl)
        {
                printf(“hello in c called java\n”);
        }

3.将本地代码生成库的形式。

gcc –fPIC –I jdk/include -I jdk/include/linux –shared –o libMyJNI.so MyJNI.c

4.运行java代码,注意指定加载.SO文件的路径。

java –Djava.library.path=. MyJNITest

(–Djava.library.path=. 表示在当前路径下加载.so库文件)

六、本案例步骤框图

发表评论
评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)