java使用JNA(Java Native Access)調(diào)用dll的方法
JNA(Java Native Access):建立在JNI之上的Java開源框架,SUN主導(dǎo)開發(fā),用來(lái)調(diào)用C、C++代碼,尤其是底層庫(kù)文件(windows中叫dll文件,linux下是so【shared object】文件)。
JNI是Java調(diào)用原生函數(shù)的唯一機(jī)制,JNA就是建立在JNI之上,JNA簡(jiǎn)化了Java調(diào)用原生函數(shù)的過(guò)程。JNA提供了一個(gè)動(dòng)態(tài)的C語(yǔ)言編寫的轉(zhuǎn)發(fā)器(實(shí)際上也是一個(gè)動(dòng)態(tài)鏈接庫(kù),在Linux-i386中文件名是:libjnidispatch.so)可以自動(dòng)實(shí)現(xiàn)Java與C之間的數(shù)據(jù)類型映射。從性能上會(huì)比JNI技術(shù)調(diào)用動(dòng)態(tài)鏈接庫(kù)要低。
1.簡(jiǎn)單寫個(gè)windows下的dll,文件命名為forjava.dll,其中一個(gè)add函數(shù),采用stdcall調(diào)用約定
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導(dǎo)入eclipse工程中,java代碼如下
//import com.sun.jna.Library; cdecl call調(diào)用約定
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調(diào)用約定時(shí)為L(zhǎng)ibrary
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));
}
}
相關(guān)文章
詳解IDEA多module項(xiàng)目maven依賴的一些說(shuō)明
這篇文章主要介紹了詳解IDEA多module項(xiàng)目maven依賴的一些說(shuō)明,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-10-10Java如何實(shí)現(xiàn)Unicode和中文相互轉(zhuǎn)換
這篇文章主要介紹了Java如何實(shí)現(xiàn)Unicode和中文相互轉(zhuǎn)換問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01Java中Spock框架Mock對(duì)象的方法經(jīng)驗(yàn)總結(jié)
這篇文章主要分享了Spock框架Mock對(duì)象的方法經(jīng)驗(yàn)總結(jié),下文分享一些常用項(xiàng)目實(shí)戰(zhàn)說(shuō)明以及代碼,供大家項(xiàng)目中參考,也具有一的的參考價(jià)值,需要的小伙伴可以參考一下2022-02-02基于maven使用IDEA創(chuàng)建多模塊項(xiàng)目
這篇文章主要介紹了基于maven使用IDEA創(chuàng)建多模塊項(xiàng)目,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-04-04學(xué)習(xí)不同 Java.net 語(yǔ)言中類似的函數(shù)結(jié)構(gòu)
這篇文章主要介紹了學(xué)習(xí)不同 Java.net 語(yǔ)言中類似的函數(shù)結(jié)構(gòu),函數(shù)式編程語(yǔ)言包含多個(gè)系列的常見(jiàn)函數(shù)。但開發(fā)人員有時(shí)很難在語(yǔ)言之間進(jìn)行切換,因?yàn)槭煜さ暮瘮?shù)具有不熟悉的名稱。函數(shù)式語(yǔ)言傾向于基于函數(shù)范例來(lái)命名這些常見(jiàn)函數(shù)。,需要的朋友可以參考下2019-06-06