国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Java > 正文

java使用JNA(Java Native Access)調(diào)用dll的方法

2019-11-26 15:54:46
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

JNA(Java Native Access):建立在JNI之上的Java開(kāi)源框架,SUN主導(dǎo)開(kāi)發(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ǔ)言編寫(xiě)的轉(zhuǎn)發(fā)器(實(shí)際上也是一個(gè)動(dòng)態(tài)鏈接庫(kù),在Linux-i386中文件名是:libjnidispatch.so)可以自動(dòng)實(shí)現(xiàn)Java與C之間的數(shù)據(jù)類(lèi)型映射。從性能上會(huì)比JNI技術(shù)調(diào)用動(dòng)態(tài)鏈接庫(kù)要低。
1.簡(jiǎn)單寫(xiě)個(gè)windows下的dll,文件命名為forjava.dll,其中一個(gè)add函數(shù),采用stdcall調(diào)用約定

復(fù)制代碼 代碼如下:

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代碼如下
復(fù)制代碼 代碼如下:

//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));
    }
}
 

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 贞丰县| 宜城市| 富阳市| 崇州市| 曲阜市| 乡宁县| 金塔县| 景泰县| 宁阳县| 西峡县| 台湾省| 平乡县| 康保县| 呼图壁县| 罗定市| 九江县| 宝清县| 濉溪县| 邯郸县| 夏邑县| 女性| 汝阳县| 广西| 鄱阳县| 昆明市| 泰宁县| 平顺县| 嵊州市| 罗山县| 湘潭市| 崇州市| 广昌县| 舟山市| 疏勒县| 聂荣县| 明溪县| 滕州市| 滕州市| 文登市| 青海省| 军事|