服务器之家

服务器之家 > 正文

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

时间:2019-10-18 13:11     来源/作者:java技术网

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)); 
    } 
}
 
标签:

相关文章

热门资讯

玄元剑仙肉身有什么用 玄元剑仙肉身境界等级划分
玄元剑仙肉身有什么用 玄元剑仙肉身境界等级划分 2019-06-21
男生常说24816是什么意思?女生说13579是什么意思?
男生常说24816是什么意思?女生说13579是什么意思? 2019-09-17
华为nova5pro和p30pro哪个好 华为nova5pro和华为p30pro对比详情
华为nova5pro和p30pro哪个好 华为nova5pro和华为p30pro对比详情 2019-06-22
抖音撒撒累累是什么歌 撒撒累累张艺兴歌曲名字
抖音撒撒累累是什么歌 撒撒累累张艺兴歌曲名字 2019-06-05
超A是什么意思 你好a表达的是什么
超A是什么意思 你好a表达的是什么 2019-06-06
返回顶部

444
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40