JNA 如何 加载多个 存在依赖的 DLL 库
JNA 的出现,极大的简化了原有的 JNI 技术。下面是JNA github地址:https://github.com/java-native-access/jna
1. 简单的一个例子:
/** Simple example of JNA interface mapping and usage. */
public class HelloWorld { public interface CLibrary extends Library {
CLibrary INSTANCE = (CLibrary)Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"), CLibrary.class); void printf(String format, Object... args); // void printf(const char *format, [argument]);
} public static void main(String[] args) {
CLibrary.INSTANCE.printf("Hello, World\n");
for (int i=0; i < args.length; i++) {
CLibrary.INSTANCE.printf("Argument %d: %s\n", i, args[i]);
}
}
}
原理是,通过 CLibrary extends Libarary 在其中加载系统的 DLL/so 库,并列出Java要调用的DLL库函数,该函数到DLL库函数直接的映射有JNA来完成。
这样就可以调用DLL/so库中的函数了。
2. 如何使用 JNA 加载多个DLL库,而且它们之间存在依赖关系
http://stackoverflow.com/questions/32609829/load-multiple-libraries-with-jna
Is there a way in JNA to load multiple libraries with Java?
I usually use Native.loadLibrary(...) to load one DLL. But I guess its not working this way because I assign this function call to the instance member.
Let's say I have library foo and library bar. bar has a dependency on foo; it also has a dependency on baz, which we are not mapping with JNA:
public class Foo {
    public static final boolean LOADED;
    static {
        Native.register("foo");
        LOADED = true;
    }
    public static native void call_foo();
}
public class Bar {
    static {
        // Reference "Foo" so that it is loaded first
        if (Foo.LOADED) {
            System.loadLibrary("baz");
            // Or System.load("/path/to/libbaz.so")
            Native.register("bar");
        }
    }
    public static native void call_bar();
}The call to System.load/loadLibrary will only be necessary if baz is neither on your library load path (PATH/LD_LIBRARY_PATH, for windows/linux respectively) nor in the same directory as bar(windows only).
EDIT
You can also do this via interface mapping:
public interface Foo extends Library {
    Foo INSTANCE = (Foo)Native.loadLibrary("foo");
}
public interface Bar extends Library {
    // Reference Foo prior to instantiating Bar, just be sure
    // to reference the Foo class prior to creating the Bar instance
    Foo FOO = Foo.INSTANCE;
    Bar INSTANCE = (Bar)Native.loadLibrary("bar");
}-----------------
3. 自己的代码例子:
public class DDLTest {
	public static void main(String[] args){
		System.out.println(System.getProperty("java.library.path"));
		FingerLibrary.Fingerdll.ZAZCloseDeviceEx(-1);
		int r = ID_FprCap.fprCap.LIVESCAN_Init();
		ID_FprCap.fprCap.LIVESCAN_Close();
		ID_FprCap.fprCap.LIVESCAN_BeginCapture(1);
		ID_FprCap.fprCap.LIVESCAN_GetFPRawData(1, "aaaaaa");
		r = ID_Fpr.INSTANCE.FP_FeatureMatch("aaaaaaaaaaa", "aaaaaaaaaaa", (float)0.5);
	}	
	public interface FingerLibrary extends Library {
		 int FPDATASIZE = 256;
		 int IMGWIDTH = 256;
		 int IMGHEIGHT = 288;
		 int IMGSIZE = 73728;
		 // 窗口消息
		 int WM_FPMESSAGE = 1024 + 120; // 自定义消息
		 int FPM_DEVICE = 0x01; // 状态提示
		 int FPM_PLACE = 0x02; // 请按手指
		 int FPM_LIFT = 0x03; // 请抬起手指
		 int FPM_CAPTURE = 0x04; // 采集图像
		 int FPM_ENROLL = 0x06; // 登记指纹模版
		 int FPM_GENCHAR = 0x05; // 采集特征点
		 int FPM_NEWIMAGE = 0x07; // 指纹图像
		 int RET_OK = 0x1;
		 int RET_FAIL = 0x0;
		 FingerLibrary Fingerdll = (FingerLibrary) Native.loadLibrary("ZAZAPIt", FingerLibrary.class);
		 public int ZAZOpenDeviceEx(int[] hHandle, int nDeviceType, int iCom, int iBaud, int nPackageSize, int iDevNum);
		 public int ZAZCloseDeviceEx(int handle);
		 public int ZAZVfyPwd(int pHandle, int nAddr,   byte[] pPassword);
		 public int ZAZReadInfPage(int pHandle, int nAddr,  byte[] pInf);
	     public int ZAZReadIndexTable(int pHandle, int nAddr, int nPage, byte[] UserContent);  
//	     public int FP_FeatureMatch(String pFeatureData1, String pFeatureData2, float pfSimilarity);
	}
	public interface ID_Fpr extends Library {
		ID_Fpr INSTANCE  = (ID_Fpr)Native.loadLibrary("ID_Fpr", ID_Fpr.class);
//		public int LIVESCAN_Init();
		public int FP_FeatureMatch(String pFeatureData1, String pFeatureData2, float pfSimilarity);
		//int __stdcall FP_FeatureMatch(unsigned char * pFeatureData1,	//输入参数 指纹特征数据1
		//		  						unsigned char * pFeatureData2,	//输入参数 指纹特征数据2
		//		  						float * pfSimilarity);			//输出参数 匹配相似度值0.00-1.00
//		typedef int (__stdcall *FP_FeatureMatch)(unsigned char * pFeatureData1,	//输入参数 指纹特征数据1
//			 	 unsigned char * pFeatureData2,	//输入参数 指纹特征数据2
//				 float * pfSimilarity);			//输出参数 匹配相似度值0.00-1.00
	}
	public interface ID_FprCap extends StdCallLibrary {
	    ID_Fpr fpr = ID_Fpr.INSTANCE ;
	    ID_FprCap fprCap = (ID_FprCap)Native.loadLibrary("ID_FprCap", ID_FprCap.class);
	    public int LIVESCAN_Init();		//int __stdcall LIVESCAN_Init();
	    public int LIVESCAN_Close();	//int __stdcall	LIVESCAN_Close();
	    public int LIVESCAN_BeginCapture(int nChannel);
	    public int LIVESCAN_GetFPRawData(int nChannel, String pRawData);
//	    int		__stdcall	LIVESCAN_BeginCapture(	int nChannel );
//	    int		__stdcall	LIVESCAN_GetFPRawData(int nChannel,unsigned char *pRawData);
	    public int LIVESCAN_GetFPBmpData(int nChannel, String pBmpData);
//	    int		__stdcall	LIVESCAN_GetFPBmpData(int nChannel, unsigned char *pBmpData);
	    public int LIVESCAN_EndCapture(int nChannel);
//	    int		__stdcall	LIVESCAN_EndCapture(int nChannel );
	    public int LIVESCAN_IsSupportSetup();
//	    int		__stdcall	LIVESCAN_IsSupportSetup();
	    public int LIVESCAN_GetVersion();
//	    int		__stdcall	LIVESCAN_GetVersion();
	    public int LIVESCAN_GetDesc(String pszDesc);
//	    int		__stdcall	LIVESCAN_GetDesc(char pszDesc[1024]);
	    public int LIVESCAN_GetErrorInfo(int nErrorNo, String pszErrorInfo);
//	    int		__stdcall	LIVESCAN_GetErrorInfo(int nErrorNo, char pszErrorInfo[256]);
	}
}
JNA 如何 加载多个 存在依赖的 DLL 库的更多相关文章
- java组件不存在解决方案:右侧Maven Projects展开后左上角第一个刷新按钮 刷新后就会从新加载所有java的依赖项了
		java组件不存在解决方案:右侧Maven Projects展开后左上角第一个刷新按钮 刷新后就会从新加载所有java的依赖项了 软件:idea 问题产生:其他同事进行开发,引入新java组件后提交 ... 
- 重新加载maven项目的依赖项
		最近在调试reportNG,测试允许完以后,报告总是使用的testNG的格式,并且只有index和overview两个文件. 找了好多帖子,大家都是那么设置的都没有问题,难道是哥人品不好?错! 大家基 ... 
- 安卓---下拉刷新---上拉加载---解决导入library等自生成库文件失败的问题
		本文的下拉刷新以及上拉加载都是用PullToRefresh实现的,关于PullToRefresh的介绍以及源码,网上可以找到很多,本人在此不再赘述. PullToRefresh是一套实现非常好的下拉刷 ... 
- 关于plsqldev无法正常加载oracle instantclient中的oci.dll的其中一个原因
		事情的经过是这样的: 1. 新安装了windows10 系统,装了plsqldev 和 oracle instantclient,以及 instantclient sqlplus. 2.设置好了ORA ... 
- Idea开发环境中,开发springboot类型的项目,如果只引入parent节点,不添加依赖节点,maven是不会加载springboot的任何依赖的
		在SpringBoot类型的项目中,我本来是要使用pringBoot,创建一个Console项目,我原本在pom.xml中添加paren节点了,天真的认为不需要再添加其他任何依赖了,可是接下来的1个小 ... 
- Linux加载/usr/local/lib中的so库
		> https://my.oschina.net/u/2306127/blog/1617233 > https://blog.csdn.net/csfreebird/article/det ... 
- PHP: php_ldap.dll不能加载解决方案
		PHP: php_ldap.dll不能加载解决方案 php.ini中开启 ldap的扩展后,重启服务:phpinfo();中没有ldap apache_error.log 提示:PHP Warning ... 
- 带加载进度的Web图片懒加载组件Lazyload
		在Web项目中,大量的图片应用会导致页面加载时间过长,浪费不必要的带宽成本,还会影响用户浏览体验. Lazyload 是一个文件大小仅4kb的图片懒加载组件(不依赖其它第三方库),组件会根据用户当前浏 ... 
- Spring Boot中采用Mockito来mock所测试的类的依赖(避免加载spring bean,避免启动服务器)
		最近试用了一下Mockito,感觉真的挺方便的.举几个应用实例: 1,需要测试的service中注入的有一个dao,而我并不需要去测试这个dao的逻辑,只需要对service进行测试.这个时候怎么办呢 ... 
随机推荐
- PHP高效率写法
			1.尽量静态化: 如果一个方法能被静态,那就声明它为静态的,速度可提高1/4,甚至我测试的时候,这个提高了近三倍.当然了,这个测试方法需要在十万级以上次执行,效果才明显.其实静态方法和非静态方法的效率 ... 
- redis持久化机制
			redis持久化 redis的数据存在内存中,所以存取性能好.但是存在内存中的数据存在一个问题,一旦机器重启,内存数据消失.为了解决这个问题,redis支持持久化.持久化就是为了解决内存数据丢失时恢复 ... 
- PHP内核探索之变量(2)-理解引用
			本文主要内容: 引论 符号表与zval 引用原理 回到最初的问题 一.引论 很久之前写了一篇关于引用的文章,当时写的寥寥草草,很多原理都没有说清楚.最近在翻阅Derick Rethans(home: ... 
- PHP  Redis 全部操作方法
			Classes and methods Usage Class Redis Class RedisException Predefined constants Class Redis Descript ... 
- java基础盲点梳理
			类的基本成员才有默认值 finalize()并非析构,Java中没有析构,使用finalize()通常在于跨语言调用情景:比如使用C进行malloc内存分配以后,要在finalize()方法中进行fr ... 
- 在Hyper-V上安装配置Windows负载均衡NLB
			搭建过程 Hyper-V 是自Windows Server2008 以来提供的虚拟机管理软件,它操作简便,功能也不错,可以方便的在它里面安装各种操作系统,如图所示: 现在,想利用这几台虚拟服务器搭建一 ... 
- 不简单的SQL查询和排序语句
			真不简单!! 一:使用select语句进行查询 语法: SELECT <列名> FROM <表名> [WHERE <查询条件表达式>] [OR ... 
- css知多少(3)——样式来源与层叠规则
			上一节<css知多少(2)——学习css的思路>有几个人留言表示思路很好.继续期待,而且收到了9个赞,我还是比较欣慰的.没看过的朋友建议先去看看上一节. 这一节就开始实践上一节的思路! 1 ... 
- javascript通用事件封装
			随着最近几年Html5的兴起,越来越多的应用采用html5进行实现,一个优秀的网页应用不但需要美观简洁的UI界面,更需要一个良好的交互.网页应用大部分的交互需要用javascript事件进行实现.虽然 ... 
- 使用异步存储提升 Web 应用程序的离线体验
			localForage 是一个 JavaScript 库,通过使用简单的.类似 localStorage 风格的 API 实现异步存储,帮助你提升 Web 应用程序的离线经验(通过 IndexedDB ... 
