JNA介绍
如果你在用Java写一个项目, 恰好这个项目中的一个模块已经有人做了实现, 而且效果很好. 当你想直接拿过来用的时候却发现这丫竟然时使用C写的, 而且你有特别想用这个现成的东西的话, 那么你就需要使用JNA了.
JNA全称Java Native Access, 是一个Java的开源框架. 用于调用C或C++编写的程序.
链接
依赖知识点
-
*.dll
,*.so
是C函数的集合文件.*.dll
适用于Windows环境,*.so
适用于Linux环境. 相当于Java中的接口. 你可以将自己的C项目打包成这两种文件共别人调用. -
Linux下生成
*.so
文件的方法如下:
gcc *.c -fPIC -shared -o *.so -
JNA引用的so文件的文件名必须为lib*.so
-
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");
}
}
使用个人动态库
-
创建saySomething.c文件:
#include <stdio.h> void saySomething(char* string) { printf("%s\n", string); }
-
生成libSaySomething.so文件:
gcc saySomething.c -fPIC -shared -o libSaySomthing.so
-
创建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"); } }