摘要:目錄創(chuàng)建創(chuàng)建項目與工具項目與工具步驟與代碼步驟與代碼使用調(diào)用使用調(diào)用項目與工具項目與工具步驟與代碼步驟與代碼實際效果實際效果參考鏈接參考鏈接創(chuàng)建項目與工具步驟與代碼使用創(chuàng)建動態(tài)鏈接庫項目設(shè)置項目名與項目
目錄
Visual Studio 2019
①使用VS創(chuàng)建動態(tài)鏈接庫(DLL)項目
②設(shè)置項目名與項目地址
創(chuàng)建好的效果如下:
③創(chuàng)建choosefiles.cpp源文件和choosefiles.h頭文件?
?
?④choosefiles.h
#ifdef CHOOSEFILES_EXPORTS#define CHOOSEFILES_API __declspec(dllexport)#else#define CHOOSEFILES_API __declspec(dllimport)#endifextern "C" CHOOSEFILES_API char* chooseFiles();
?⑤choosefiles.cpp
#include "pch.h"#include "framework.h"#include "choosefiles.h"#include #include #include #include using namespace std;/*TCHAR*轉(zhuǎn)char**/char* LPWSTR2LPSTR(LPWSTR lpwszStrIn){ LPSTR pszOut = NULL; if (lpwszStrIn != NULL) { int nInputStrLen = wcslen(lpwszStrIn); int nOutputStrLen = WideCharToMultiByte(CP_ACP, 0, lpwszStrIn, nInputStrLen, NULL, 0, 0, 0) + 2; pszOut = new char[nOutputStrLen]; if (pszOut != NULL) { memset(pszOut, 0x00, nOutputStrLen); WideCharToMultiByte(CP_ACP, 0, lpwszStrIn, nInputStrLen, pszOut, nOutputStrLen, 0, 0); } } return pszOut;}CHOOSEFILES_API char* chooseFiles() { OPENFILENAME ofn; TCHAR szOpenFileNames[80 * MAX_PATH] = { 0 }; TCHAR szPath[MAX_PATH]; TCHAR szFileName[80 * MAX_PATH]; int nLen = 0; TCHAR* p = NULL; ZeroMemory(&ofn, sizeof(ofn)); // 結(jié)構(gòu)體大小 ofn.lStructSize = sizeof(ofn); // 擁有著窗口句柄 ofn.hwndOwner = NULL; // 接收返回的文件名,注意第一個字符需要為NULL ofn.lpstrFile = szOpenFileNames; // 緩沖區(qū)長度 ofn.nMaxFile = sizeof(szOpenFileNames); // _T可替換為TEXT,使用_T需要引tchar.h ofn.lpstrFile[0] = _T("/0"); // 設(shè)置過濾 ofn.lpstrFilter = _T("All/0*.*/0.mp4/0*.mp4/0.avi/0*.avi/0.mkv/0*.mkv/0.rmvb/0*.rmvb/0.f4v/0*.f4v/0.flv/0*.flv/0.m4v/0*.m4v/0.mpg/0*.mpg/0/0"); // 過濾器索引 ofn.nFilterIndex = 1; // 窗口標題 ofn.lpstrTitle = _T("請選擇視頻"); // 文件必須存在、允許多選、隱藏只讀選項、對話框使用資源管理器風(fēng)格的用戶界面 // 官方文檔:https://docs.microsoft.com/en-us/windows/win32/api/commdlg/ns-commdlg-openfilenamea ofn.Flags = OFN_FILEMUSTEXIST | OFN_ALLOWMULTISELECT | OFN_HIDEREADONLY | OFN_EXPLORER; // 定義字符串,用于拼接所選的所有文件的完整路徑 string str = "***"; // 如果打開文件失敗,則不操作;打開成功才操作 if (GetOpenFileName(&ofn)) { // 把第一個文件名前的復(fù)制到szPath,即: // 如果只選了一個文件,就復(fù)制到最后一個"/" // 如果選了多個文件,就復(fù)制到第一個NULL字符 lstrcpyn(szPath, szOpenFileNames, ofn.nFileOffset); // 當只選了一個文件時,下面這個NULL字符是必需的. // 這里不區(qū)別對待選了一個和多個文件的情況 szPath[ofn.nFileOffset] = "/0"; nLen = lstrlen(szPath); // 如果選了多個文件,則必須加上"http://" if (szPath[nLen - 1] != "http://") { lstrcat(szPath, _T("http://")); } // 把指針移到第一個文件 p = szOpenFileNames + ofn.nFileOffset; // 對szFileName進行清零 ZeroMemory(szFileName, sizeof(szFileName)); while (*p) { // 讀取文件名 string fileName = LPWSTR2LPSTR(p); // 讀取文件所在文件夾路徑 string filePath = LPWSTR2LPSTR(szPath); // 拼接文件完整路徑 string completePath = filePath + fileName; // 拼接字符串 str += completePath + "***"; //移至下一個文件 p += lstrlen(p) + 1; } } // 將string轉(zhuǎn)為char* char* strc = new char[strlen(str.c_str()) + 1]; const char* cc = str.c_str(); strcpy_s(strc, str.size() + 1, cc); return strc;}
?⑥改成64位程序(由于我使用的是64位的jdk,所以需要生成64位的dll)
?⑦生成解決方案
生成成功提示如下:
dll文件:
idea、maven(選擇maven-archetype-quickstart骨架)、Java8、JNA
①創(chuàng)建好項目之后,創(chuàng)建resources文件夾,并將dll文件復(fù)制進去
②設(shè)置項目資源文件夾
設(shè)置好后結(jié)果如下:
③添加jna依賴并刷新maven
? net.java.dev.jna jna 5.5.0
④創(chuàng)建DLL接口
package cxzgwing;import com.sun.jna.Library;import com.sun.jna.Native;public interface DLL extends Library { DLL dll = Native.load("choosefiles", DLL.class); String chooseFiles();}
⑤調(diào)用
package cxzgwing;public class App { public static void main(String[] args) { System.setProperty("jna.encoding", "GBK"); System.out.println(DLL.dll.chooseFiles()); }}
若點擊取消,則輸出三個星號(***):
?可選擇顯示的文件類型:
?
[1]?Aimls.Java使用JNA調(diào)用C/C++動態(tài)鏈接庫dll.2019-07-26 14:44:22
Java使用JNA調(diào)用C/C++動態(tài)鏈接庫dll_嗶哩嗶哩_bilibili
[2]?晨曦之光Wing.C++打開文件選擇框多選文件.2021-10-09 00:03:40
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/123076.html
使用JNI進行Java與C/C++語言混合編程----在Java中調(diào)用C/C++生成的DLL動態(tài)鏈接庫 JNI是Java Native Interface的英文縮寫, 中文翻譯為本地調(diào)用, 自從Java 1.1開始就成為了Java標準的一部分.Java調(diào)用C/C++大概有這樣幾個步驟 編寫帶有native方法的Java類, 使用javac工具編譯Java類 使用javah來生成與native方法...
摘要:序在里頭如何獲取硬盤的序列號呢,這里涉及了跨平臺的問題,不同的操作系統(tǒng)的查看命令不一樣,那么里頭如何去適配呢。這里使用了這個項目來獲取。使用的是的方式而不是的形式來進行本地調(diào)用的。獲取方法,,,和之間的區(qū)別是什么,它們的調(diào)用效率怎么排名 序 在java里頭如何獲取硬盤的序列號呢,這里涉及了跨平臺的問題,不同的操作系統(tǒng)的查看命令不一樣,那么java里頭如何去適配呢。這里使用了oshi這個...
閱讀 623·2023-04-26 02:08
閱讀 2654·2021-11-18 10:02
閱讀 3459·2021-11-11 16:55
閱讀 2341·2021-08-17 10:13
閱讀 2901·2019-08-30 15:53
閱讀 685·2019-08-30 15:44
閱讀 2545·2019-08-30 11:10
閱讀 1755·2019-08-29 16:57