JNA使用方法

Apr 26, 2016


JNA介绍

如果你在用Java写一个项目, 恰好这个项目中的一个模块已经有人做了实现, 而且效果很好. 当你想直接拿过来用的时候却发现这丫竟然时使用C写的, 而且你有特别想用这个现成的东西的话, 那么你就需要使用JNA了.

JNA全称Java Native Access, 是一个Java的开源框架. 用于调用C或C++编写的程序.

链接

依赖知识点

  1. *.dll,*.so是C函数的集合文件.*.dll适用于Windows环境, *.so适用于Linux环境. 相当于Java中的接口. 你可以将自己的C项目打包成这两种文件共别人调用.

  2. Linux下生成*.so文件的方法如下:
    gcc *.c -fPIC -shared -o *.so

  3. JNA引用的so文件的文件名必须为lib*.so

  4. Java-C的数据类型对应表,请从这里查看

JNA使用

使用系统动态链接库

    import com.sun.jna.Library;
    import com.sun.jna.Native;
    import com.sun.jna.Platform;

    /** Simple example of JNA interface mapping and usage. */
    public class jna1
    {

	/**
	 * 定义一个接口继承Library.
	 * 接口中需要定义一个静态常量:Instance. 通过这个常量获取接口的对象.
	 * 同时在接口中定义要使用的方法,这些方法都出自于*.dll或者*.so文件.
	 * */
	public interface Clibrary extends Library
	{
		//使用系统动态链接库msvcrt, c
		Clibrary Instance = (Clibrary) Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"), Clibrary.class);

		void printf(String format, Object... args);
	}

	public static void main(String[] args)
	{
		Clibrary.Instance.printf("Hello World\n");
	}
    }

使用个人动态库

  1. 创建saySomething.c文件:

     #include <stdio.h>
    
     void saySomething(char* string)
     {
     printf("%s\n", string);
     }
    
  2. 生成libSaySomething.so文件:

     gcc saySomething.c -fPIC -shared -o libSaySomthing.so
    
  3. 创建Java项目, 使用libSaySomething.so:

     import com.sun.jna.Library;
     import com.sun.jna.Native;
    
     /** 引用libSaySomething.so文件 */
     public class SaySomthing
     {
     public interface CLibrary extends Library
     {
         CLibrary Instance = (CLibrary) Native.loadLibrary
                 ("lib/libSaySomething.so", CLibrary.class);
    	
         void saySomething(String something);
     }
    	
     public static void main(String[] args)
     {
         CLibrary.Instance.saySomething("Winter is coming");
     }
     }
    

参考文献


上一篇博客:Java单例模式与线程安全
下一篇博客:线程安全的集合