好久沒有寫隨筆了,前段時間參與的項目需要使用JAVA調用C++編寫的算法庫,現在也來分享一下簡單的調用教程,Java調用dll/so庫一般是有JNI、JNative、JNA。
由於JNI操作比較繁瑣,而且也不需要C++調用JAVA的代碼,便沒有采用;JNative好久不更新了,現在只有32位的支持,於是采用了JNA。
使用VS生成DLL,簡單的main示例:
main.cpp
#include "main.h" int add(int a, int b){ return a + b; } BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { switch (fdwReason) { case DLL_PROCESS_ATTACH: break; case DLL_PROCESS_DETACH: break; case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: break; } return TRUE; }
main.h
#ifndef __MAIN_H__ #define __MAIN_H__ #include <windows.h> #ifdef BUILD_DLL #define DLL_EXPORT __declspec(dllexport) #else #define DLL_EXPORT __declspec(dllimport) #endif //注意頭文件一定是要把讓外部調用的方法聲明出去 #ifdef __cplusplus extern "C" { #endif DLL_EXPORT int add(int a, int b); #ifdef __cplusplus } #endif #endif
這樣的話在VS里生成DLL文件,注意:
JDK、系統版本、DLL三者的位數一定要一致!是64位就統一是64位的。
再來編寫JAVA代碼,在項目中需要引入JNA的jar包,我是在maven中直接引入的,也可以找一下jna的包直接引入也可以。
Maven的引入:
<dependency> <groupId>net.java.dev.jna</groupId> <artifactId>jna</artifactId>
</dependency>
引入完成所需要的jar包之后,我們需要在JAVA代碼中加載DLL:
public class Test { public interface CLibrary extends Library { CLibrary cLibrary = (CLibrary) Native.loadLibrary("JNATest", CLibrary.class); //聲明DLL庫里提供的方法 int add(int a ,int b); } public static void main(String[] args) { int res=Test.CLibrary.cLibrary.add(1, 2);
//這樣就能成功輸出結果 System.out.println(res); } }
注:
JNA在系統平台上會搜索項目當前路徑跟系統的path路徑查找DLL/SO庫文件,在此之前一定保證庫文件的依賴是全面的,能正常使用庫文件,JNA才能成功調用!
可以使用System.getProperty("java.library.path")查看所要查看的路徑。