創建dll動態鏈接庫,並使用java調用


參考文章:http://www.cnblogs.com/matthew-2013/p/3480296.html

              http://blog.csdn.net/g710710/article/details/7255744

 

首先探討何為動態鏈接庫,按照百毒百科的解釋:

【動態鏈接庫(Dynamic Link Library 或者 Dynamic-link Library,縮寫為 DLL),是微軟公司在微軟Windows操作系統中,實現共享函數庫概念的一種方式。這些庫函數的擴展名是 ”.dll"、".ocx"(包含ActiveX控制的庫)或者 ".drv"(舊式的系統驅動程序)。
動態鏈接提供了一種方法,使進程可以調用不屬於其可執行代碼的函數。函數的可執行代碼位於一個 DLL 文件中,該 DLL 包含一個或多個已被編譯、鏈接並與使用它們的進程分開存儲的函數。DLL 還有助於共享數據和資源。多個應用程序可同時訪問內存中單個 DLL 副本的內容。
使用動態鏈接庫可以更為容易地將更新應用於各個模塊,而不會影響該程序的其他部分。例如,您有一個大型網絡游戲,如果把整個數百MB甚至數GB的游戲的代碼都放在一個應用程序里,日后的修改工作將會十分費時,而如果把不同功能的代碼分別放在數個動態鏈接庫中,您無需重新生成或安裝整個程序就可以應用更新。】

 

vs2012創建項目,win32 - win32項目,名稱MyDLL。應用程序設置,選擇DLL選項。

新建頭文件testdll.h

#ifndef TestDll_H_
#define TestDll_H_
#ifdef MYLIBDLL
#define MYLIBDLL extern "C" _declspec(dllimport) 
#else
#define MYLIBDLL extern "C" _declspec(dllexport) 
#endif
MYLIBDLL int Add(int plus1, int plus2);
//You can also write like this:
//extern "C" {
//_declspec(dllexport) int Add(int plus1, int plus2);
//};
#endif

新建cpp testdll.cpp

#include "stdafx.h"
#include "testdll.h"
#include <iostream>
using namespace std;
int Add(int plus1, int plus2)
{
    int add_result = plus1 + plus2;
    return add_result;
}

在源文件目錄下新建mydll.def

LIBRARY "MyDLL"
EXPORTS
Add @1

dllmain.cpp是自動創建的,定義了dll應用程序的入口

// dllmain.cpp : 定義 DLL 應用程序的入口點。
#include "stdafx.h"

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

之后,編譯,生成。

在workspace的MyDLL\Debug目錄即可找到生產的MyDLL.dll。

將該dll文件放到jdk的bin目錄下。

打開eclipse,隨意新建個項目。testdll

加入依賴的jna的jna-4.2.2.jar包。

 

 寫代碼:

package testdll;

import com.sun.jna.Native;
import com.sun.jna.win32.StdCallLibrary;

/**
 * @author sonne
 */
public class JNA {
    public interface CLibrary extends StdCallLibrary {
        CLibrary INSTANCE = (CLibrary) Native.loadLibrary("MyDLL.dll", CLibrary.class);
        int Add(int plus1, int plus2);
    }

    public static void main(String[] args) {
        int result = CLibrary.INSTANCE.Add(1,2);
        System.out.println("結果為" + result);
    }
}

這里需要定義java接口,該接口中方法與dll庫函數方法一致,通過jna來調用這個接口實際上就是調用dll動態鏈接庫。運行結果為,3。

可知是調用了dll的Add方法。求得1+2=3.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM