參考文章: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.