天天看点

JNA编程之一:入门

        自从接触Java编程以来,有个问题一直缠绕着我:怎样才能在Java中调用以前用C/C++开发的劳动成果(函数库)?于是起头百度、Google了若干下,初步发现有个叫JNI的“小伙子”,一会儿把它的简介读完后,让人觉得仿佛要“围着Java打转转”的味道。对于我这个一直钟情于C说话开发的人来讲,有点难以接受:“别太嚣张了,薄道点嘛,C/C++才是真正的老大啊”。于是继绝搜刮,幸好Java照样有点“自知之明”,自我推出了JNA,甘愿“臣服于”C/C++。         好了,一堆废话后照样要进入主题,所谓JNA就是“Java Native Access”的缩写。说白了就是Java直接访问/调用本天动态库。最好的入门方法就是从JNA的官网起头。

0. 备注:

操作系统:Ubuntu-10.10 工作用户:root JDK版本:1.6&1.7 开发环境:eclipse 实验目的:下载安装JNA,并测试JNA调用本天C动态库的printf函数。

1. 下载jna.jar

到JNA官网下载最新版本的“jna.jar”,当前的最新版是3.4.0。链接以下: https://github.com/twall/jna

2. 安装jna.jar

将jna.jar文件移动到JKD的安装目次的子目次,我的是:/opt/java/jdk1.7.0/lib。这个jna.jar文件也可以放在任何目次,比如您正在开发的Java工程目次。

3. 建立eclipse-java工程

启动eclipse,并新建一个Java工程JnaTest。

4. 添加Java源文件

在JnaTest工程中添加Java源文件HelloJna.java,并在源文件中输入以下代码:

package myjava.jna.test;

import com.sun.jna.Library; import com.sun.jna.Native; import com.sun.jna.Platform;   public class HelloJna { //定义接口CLibrary,继承自com.sun.jna.Library     public interface CLibrary extends Library     {     //定义并初始化接口的静态变量     CLibrary Instance=(CLibrary)Native.loadLibrary((Platform.isWindows()?"msvcrt":"c"),CLibrary.class);

        //printf函数声明         void printf(String format, Object... args);     }       public static void main(String[] args)     {     //调用printf打印信息     CLibrary.Instance.printf("Hello, JNA!\n");     } }

提示:上述代码主要是参考JNA官网的例程。

5. 配置工程引用jna.jar库

5.1 在eclipse左边的Workspace项目管理器中右击项目JnaTest,选择属腾讯视频性“Properties”,如图5-1所示。

JNA编程之一:入门

图5-1:配置项目属性  5.2 点击“Properties”后,在弹出的“Properties for JnaTest”对话框中点击左边的“Java Build Path”,然后再点击对话框中间的“Libraries”选项卡,最后点击右边的“Add External JARs...”按钮,如图5-2所示。

JNA编程之一:入门

图5-2:为工程添加扩展的JAR文件  5.3 在弹出的“JAR Selection”对话框中找到第2步安装的jna.jar文件,点击“肯定”按钮,如图5-3所示。

JNA编程之一:入门

图5-3:选择jna.jar文件  

 6. 编译并运行程序

运行了局如图6-1所示。

JNA编程之一:入门

图6-1:程序运行了局  

 7. JNA编程根基语法解析

7.1 自定义一个接口,该接口继承(扩展)自com.sun.jna.Library接口,如上面示例代码中的CLibrary接口。 7.2 在自定义的接口中声明将要调用的函数本型,这些函数本型必须要期近将加载的动态库中有对应的实例。如上面示例代码中的printf函数声明。如果是在微软的Windows环境下,该函数寄存在msvcrt.dll动态库中;如果是在Linux环境下,该函数寄存在libc.so动态库中。 7.3 在调用函数之前,先将接口实例化,并调用Native.loadLibrary对接口的实例初始化。如上面示例代码中的Instance实例初始化。 7.4 在上面的操作都正常完成后,即可在有需要的中央调用对应的C/C++函数。

文根英博客立志减肥 为明年复出新作准备(