zoukankan      html  css  js  c++  java
  • JNI接口的整理

    一.JDK环境的安装

    (1)、jdk安装

        JDK作为JAVA开发的环境,不管是做JAVA开发的学生,还是做安卓开发的同学,都必须在电脑上安装JDK。下面就教大家如何安装JDK。

        首先上甲骨文公司的官方网站下载JDK的安装包,根据自己电脑的操作系统选择正确的版本下载。不知道下载地址的同学可以百度一下很快就能搜到。附件里面有一份安装包

    • 用鼠标左键双击JDK安装包,会出现下图所示的安装界面。

    • 其实上面那个步骤是在加载配置,为安装JDK做前期准备。之后会出现下图所示的界面。

    • 我们选中“我接受该许可证协议中的条款”,“下一步”按钮将自动激活,然后点击该按钮,会出现下图所示的自定义安装界面。

    • 可以根据需要选择不同的安装路径和安装内容。这里我们保持默认选择。点击“下一步”出现下图所示的“正在安装”界面。

    • 等待进度条到100%的时候,又会跳出“自定义安装”界面,这个时候要安装的是语言支持插件。直接点击下一步。

    • 然后会出现浏览器关联选项,可以根据自己的需要选择,安装完毕后还可以在控制面板中更改该选项。

    • 点击“下一步”会出现安装完成的提示。当然这步要注意一下,360安全卫士可能会提示木马防火墙,大家要选择“允许程序的所有操作”,否则可能会造成JDK安装不完整。

    (2)、JDK环境变量配置

        完成了第一步,只是把JDK环境安装完成了。这个时候还要通过一系列的环境变量的配置才能使用JDK环境进行JAVA开发。配置环境变量包括java_home,path和classpath三个部分。

    • 用鼠标右击“我的电脑”,选择“属性”->“高级”->“环境变量”->“系统变量”->“新建”。

    • 在“变量名”输入框中写入“java_home”,在“变量值”输入框中写入“C:Program FilesJavajdk1.6.0” (根据安装路径填写),然后点击“确定”,java_home就设置完成了。

    • 下面开始“classpath”的配置。选中“系统变量”查看是否有classpath项目,如果没有就点击“新建”,如果已经存在就选中classpath选项,点击“编辑”按钮,然后在“变量名”中填写“classpath”,在“变量值”中填写“C:Program FilesJavajdk1.6.0jrelib”(根据安装路径填写)。

    • 现在可以进行“path”的配置了。同上在“classpath”设定时类似,“变量名”输入框填写“path”,“变量值”输入框填写“C:Program FilesJavajdk1.6.0in”(根据安装路径填写)。

    • JDK的环境变量已经配置完成,可以通过打开命令提示符窗口,输入命令“java -version”, 看到Java版本的信息,来确定安装是否成功。首先点击“开始”,然后点击“运行”。

    • 然后会出现下图所示的输入界面,输入“cmd”,按"Enter"键。

    • 这个时候就进入了“命令提示符”窗口。这个时候输入“java -version”,特别注意 java和-version之间有一个空格,按"Enter"键。

    • JDK版本信息就全部显示出来了,也表面JDK已经安装和配置完成,可以开始进行JAVA开发了。

    • 注意事项:安装路径跟环境配置有很大关系,建议大家安装路线设置成较为简单的。


    (3)、eclipse集成开发环境

        Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。

    在附件里提供一个绿色版的eclipse开发工具,直接解压后可以双击进行打开使用。

    • 建立工程

    • 新建java文件进行Helloworld进行测试

        在helloWorld的src图标上右击然后建立一个java类,并填写类名称。

    • 编写java的hello world然后进行测试

    • 点击2运行会在控制台的界面中显示一行hello world的打印如下图,那么环境安装就成功了。

    二. JNI接口的实现

    (1)、什么是JNI    

        JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)。从Java1.1开始,JNI标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他编程语言,只要调用约定受支持就可以了。使用java与本地已编译的代码交互,通常会丧失平台可移植性。但是,有些情况下这样做是可以接受的,甚至是必须的。例如,使用一些旧的库,与硬件、操作系统进行交互,或者为了提高程序的性能。JNI标准至少要保证本地代码能工作在任何Java 虚拟机环境下。

        总的来说,JNI就是一个允许Java语言和其他编程语言(主要是C/C++)通信的接口。C/C++是系统级的编程语言, 可以用来开发任何和系统相关的程序和类库, 但是Java本身编写底层的应用比较难实现, 使用JNI可以调用现有的本地库, 极大地灵活了Java的开发. C/C++的效率是目前最好的语言, 可以使用C/C++来实现一些实时性非常高的部分. C/C++和Java本身都是非常流行的编程语言, 一些大型软件中经常使用语言之间的混合编程.

        一旦使用JNI, JAVA程序就丧失了JAVA平台的两个优点: 程序不在跨平台。要想跨平台,必须在不同的系统环境中重新编译本地语言部分;程序不再是绝对安全的,本地代码的不当使用可能导致整个程序崩溃。一个通用的规则是,你应该让本地方法集中在少数几个类当中,这样就降低了Java语言和C/C++之间的耦合性。

    使用JNI实现Java与C语言混合编程的基本步骤如下:

    1. 编写带有native声明的方法的java类
    2. 使用javac命令编译所有的java类
    3. 然后使用javah + 类名生成扩展名为.h的头文件
    4. 使用C/C++实现本地方法
    5. 将C/C++编写的文件生成动态链接库

    说明
        对于上面所说的java使用了JNI接口会丧失平台的可移植性解释如下:
            JNI提供出来一个功能接口,但是这个功能是使用本地语言进行实现的,通常是C或者C++。以linux系统和window系统的printf函数为例,虽然这两个系统都提供了这个打印函数,并且名字也一样,但是在实现上可能会有各自的不同点。同时在window下的动态库为dll文件,linux下的动态库为so文件。所以我原本在linux下可以正常使用的一套JNI功能,一旦需要转移到window上执行的时候就需要重新编译实现接口的动态库。虽然java是跨平台的,但是使用jni调用的本地方法却是与平台相依赖的,会在进行编译的过程中会出现这样或者那样的兼容性问题,一般不能直接拿来就能编译成功。

    (2)、使用JNI机制来实现java和C的接口

        使用一个测试例子来进行演示JNI的流程,以java调用C一个简单的加法计算为例,首先使用javah来生成一个jni的接口,然后使用C语言将这个接口进行实现并编译后提供给java进行使用,按照上面所述的基本步骤进行展开的具体过程如下:

    • java与c的接口需要使用native关键字进行声明。在新建的java文件中如下进行编写一个需要本地方法的类,重新建立一个test工程然后新建一个TestAdd类添加文件编程如下


    • 使用javah命令生成接口头文件,注意要进入到src的目录下。

            javah -classpath . -jni com.jni.Test

            然后会在这个目录下生成一个test_TestAdd.h

           test_TestAdd.h不需要修改直接就可以使用,里面的内容就是接口的内容如下:

    • 使用dev编写C程序并生成dll动态库文件
        新建一个dev-C++工程如下

    • 新建一个nativeadd.c文件,并将上面生成的test_TestAdd.h头文件添加进工程并包含进来。在新建的C文件里面实现如下:


    • 然后在编译的时候需要设置一下用到一些jni本身的头文件位置:项目----》项目属性----》文件/目录----》包含文件目录

    • 然后点击开始编译可以在项目的目录下得到一个dll文件。
    • 在java项目中调用生成的dll文件。

        将生成的dll文件放到指定的java库的环境变量的目录下,然后在调用C的方法之前使用System.loadLibrary("nativeadd");方法来加载该dll文件到项目中。

    然后就可以如上面第五步中的测试一样正常的编译和执行。会得到一个1+2的结果在控制台中打印出3。



    参考的JNI介绍的帖子:

    http://www.cnblogs.com/moon1992/p/5258245.html

    http://www.cnblogs.com/moon1992/p/5260226.html






    附件列表

    • 相关阅读:
      蜕变过程中的思考
      Django template for 循环用法
      Django 发送html邮件
      Django F对象的使用
      在Django中使用Q()对象
      ubuntu中管理用户和用户组
      Django settings.py 的media路径设置
      Git版本控制 备忘录
      Git .gitignore文件的使用
      将git关联到pycharm
    • 原文地址:https://www.cnblogs.com/cfzhang/p/2d3dfa45a981ed42cfee9398a24420c0.html
    Copyright © 2011-2022 走看看