java使用JNA(Java Native Access)调用dll的方法

 更新时间:2013年11月11日 11:29:27   作者:  
java使用JNA(Java Native Access)调用windows系统的dll文件的例子

JNA(Java Native Access):建立在JNI之上的Java开源框架,SUN主导开发,用来调用C、C++代码,尤其是底层库文件(windows中叫dll文件,linux下是so【shared object】文件)。
JNI是Java调用原生函数的唯一机制,JNA就是建立在JNI之上,JNA简化了Java调用原生函数的过程。JNA提供了一个动态的C语言编写的转发器(实际上也是一个动态链接库,在Linux-i386中文件名是:libjnidispatch.so)可以自动实现Java与C之间的数据类型映射。从性能上会比JNI技术调用动态链接库要低。
1.简单写个windows下的dll,文件命名为forjava.dll,其中一个add函数,采用stdcall调用约定

复制代码 代码如下:

main.h文件
#ifndef __MAIN_H__
#define __MAIN_H__

#include <windows.h>

/*  To use this exported function of dll, include this header
 *  in your project.
 */

#ifdef BUILD_DLL
    #define DLL_EXPORT __declspec(dllexport) __stdcall
#else
    #define DLL_EXPORT __declspec(dllimport) __stdcall
#endif

#ifdef __cplusplus
extern "C"
{
#endif

int DLL_EXPORT add(int a,int b);

#ifdef __cplusplus
}
#endif

#endif // __MAIN_H__

main.cpp

#include "main.h"

// a sample exported function
int DLL_EXPORT add(int a ,int b)
{
    return a+b;
}

extern "C" DLL_EXPORT BOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
    switch (fdwReason)
    {
        case DLL_PROCESS_ATTACH:
            // attach to process
            // return FALSE to fail DLL load
            break;

        case DLL_PROCESS_DETACH:
            // detach from process
            break;

        case DLL_THREAD_ATTACH:
            // attach to thread
            break;

        case DLL_THREAD_DETACH:
            // detach from thread
            break;
    }
    return TRUE; // succesful
}
 


2.将jna.jar导入eclipse工程中,java代码如下
复制代码 代码如下:

//import com.sun.jna.Library; cdecl call调用约定
import com.sun.jna.Native;
import com.sun.jna.Platform;
import com.sun.jna.win32.StdCallLibrary;

public class main {

    public interface CLibrary extends StdCallLibrary { //cdecl call调用约定时为Library
        CLibrary INSTANCE = (CLibrary)Native.loadLibrary("forjava",CLibrary.class);
        public int add(int a,int b);
    }

    public static void main(String[] args) {
        System.out.print(CLibrary.INSTANCE.add(2,3));
    }
}
 

相关文章

  • Java编程swing组件JLabel详解以及使用示例

    Java编程swing组件JLabel详解以及使用示例

    这篇文章主要介绍了Java编程swing组件JLabel详解以及使用示例,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • 详解IDEA多module项目maven依赖的一些说明

    详解IDEA多module项目maven依赖的一些说明

    这篇文章主要介绍了详解IDEA多module项目maven依赖的一些说明,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-10-10
  • 详谈Springfox与swagger的整合使用

    详谈Springfox与swagger的整合使用

    下面小编就为大家带来一篇详谈Springfox与swagger的整合使用。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • Java如何实现Unicode和中文相互转换

    Java如何实现Unicode和中文相互转换

    这篇文章主要介绍了Java如何实现Unicode和中文相互转换问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • Java中Spock框架Mock对象的方法经验总结

    Java中Spock框架Mock对象的方法经验总结

    这篇文章主要分享了Spock框架Mock对象的方法经验总结,下文分享一些常用项目实战说明以及代码,供大家项目中参考,也具有一的的参考价值,需要的小伙伴可以参考一下
    2022-02-02
  • 如何在不使用spring框架中使用aop的功能

    如何在不使用spring框架中使用aop的功能

    这篇文章主要介绍了如何在不使用spring框架中使用aop的功能,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • Mybatis-plus如何更新Null字段详解

    Mybatis-plus如何更新Null字段详解

    MyBatis-plus在进行更新操作时不会更新传入实体中为null或默认值属性字段,只更新不为null的值、非默认值的属性字段,这篇文章主要给大家介绍了关于Mybatis-plus如何更新Null字段的相关资料,需要的朋友可以参考下
    2023-07-07
  • 教你在SpringBoot中管理多环境配置文件

    教你在SpringBoot中管理多环境配置文件

    在项目开发中,一般会分为开发环境,测试环境和生产环境.如果总是在一个文件中修修改改,难免会出现错误,尤其是在交接的过程中,一旦出现问题,轻则丢失绩效,重则需要删库跑路.本文则带大家详细了解怎么管理多环境配置文件,需要的朋友可以参考下
    2021-05-05
  • 基于maven使用IDEA创建多模块项目

    基于maven使用IDEA创建多模块项目

    这篇文章主要介绍了基于maven使用IDEA创建多模块项目,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • 学习不同 Java.net 语言中类似的函数结构

    学习不同 Java.net 语言中类似的函数结构

    这篇文章主要介绍了学习不同 Java.net 语言中类似的函数结构,函数式编程语言包含多个系列的常见函数。但开发人员有时很难在语言之间进行切换,因为熟悉的函数具有不熟悉的名称。函数式语言倾向于基于函数范例来命名这些常见函数。,需要的朋友可以参考下
    2019-06-06

最新评论