JNA 详细完整实例

啰嗦话不多说,网上很多这方面的教程,但是我也看了好久也能运行一个成功的例子,因为很多地方都忽略了

 

下面来演示个完整的jna例子

 

1. 随便使用个c或c++开发工具(我用的VC++6.0)

打开软件新建个dll工程,VC里面是win32 dynamic-link library,输入工程名称后点击下一步,然后再选a simple dll project,第一项是空的project,我比较懒就选第二个,有简单的文件存在,然后自己拿来改下,最后确定就能看到工程已经建好了

 

2. 写C的接口文件,就是以.h结尾的那个文件,选择文件-->新建-->C/C++Header File文件,然后就能看到工程的header文件中有了个新的.h文件(我起的名字是test)

然后打开test.h文件,声明我的接口咯

 

这里值得注意的地方是必须写(extern "c"的声明,不然到时候使用Java的jna是不可能匹配到这个方法的,很明显会抛出异常java.lang.UnsatisfiedLinkError: Error looking up function 'add': ÕҲ»µ½ָ¶¨µ),这个文件相当于我们的java中的interface,你可以这样理解

 

 

[html]  view plain  copy
 
  1. extern "C" _declspec(dllexport)   
  2.   
  3. int add(int first, int second);    



 

3. 写C接口的实现类,如何实现这个add方法

 

打开source file很明显看到有一个文件是xxx.cpp(xxx是以你的工程名字来定的), 另外一个是stdafx.cpp, 这个不需要管他, 我们就在xxx.cpp中写代码吧

 

xxx.cpp原本就存在内容,你不喜欢的,可以直接新建一个source file

 

[html]  view plain  copy
 
  1. // sss.cpp : Defines the entry point for the DLL application.  
  2. //  
  3.   
  4. #include "stdafx.h"  
  5.   
  6. BOOL APIENTRY DllMain( HANDLE hModule,   
  7.                        DWORD  ul_reason_for_call,   
  8.                        LPVOID lpReserved  
  9.                      )  
  10. {  
  11.     return TRUE;  
  12. }  

 

 

然后我们在这些内容下添加我们的add方法实现,要include我们刚刚写的test.h文件

 

 

[html]  view plain  copy
 
  1. // sss.cpp : Defines the entry point for the DLL application.  
  2. //  
  3.   
  4. #include "stdafx.h"  
  5. #include "test.h"  
  6.   
  7. BOOL APIENTRY DllMain( HANDLE hModule,   
  8.                        DWORD  ul_reason_for_call,   
  9.                        LPVOID lpReserved  
  10.                      )  
  11. {  
  12.     return TRUE;  
  13. }  
  14.   
  15. int add(int a, int b){  
  16.     return a+b;  
  17. }  



 

 

4. C方面的基本的完成了,最后就是打包成dll,直接按F7,全自动打包,然后找到这个工程的目录下,看到有一个debug的文件夹,里面就有一个dll,等下直接扔到java工程中

 

5. 打开eclipse新建一个java project, 把刚刚的dll拷贝到工程的目录下点着工程的名字,然后黏贴下去就可以了, 然后随便在网上找个jna.jar文件,build path到这个工程中

 

然后开始我们的java接口, loadLibrary第一个参数就是你的dll名字,第二个就是当前接口的.class类型,接口里面的方法名要跟C的接口方法名一直

 

 

[html]  view plain  copy
 
  1. public interface TestJNA extends StdCallLibrary {  
  2.   
  3.     public abstract int add(int a, int b);  
  4.       
  5.     TestJNA INSTANCE = (TestJNA) Native.loadLibrary("test", TestJNA.class);  
  6. }  


写完就调用测试下

 

 

 

[html]  view plain  copy
 
  1. public class TEST {  
  2.   
  3.     /**  
  4.      * @param args  
  5.      */  
  6.     public static void main(String[] args) {  
  7.         System.out.println(TestJNA.INSTANCE.add(1, 2));  
  8.     }  
  9.   
  10. }  

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值