日韩精品一区二区三区在线视频放-无码中文字幕V?一区二区-成年片免费观看视频-国内少妇人妻丰满av-国产精品中文字幕免费观看-亚洲成人久久一区二区三区-国内少妇偷人精品视频无缓冲-一区二区国产精品日本一区二区三区在线网

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

Java調(diào)用Windows API實(shí)戰(zhàn):JNA原理與系統(tǒng)級(jí)開(kāi)發(fā)指南

Java調(diào)用Windows API實(shí)戰(zhàn):JNA原理與系統(tǒng)級(jí)開(kāi)發(fā)指南 1. 為什么 Java 程序員需要親手敲開(kāi) Windows 系統(tǒng)的大門Java 的“一次編寫到處運(yùn)行”是教科書里的金句但現(xiàn)實(shí)里你總得和 Windows 打交道——不是為了寫個(gè)跨平臺(tái) GUI而是要干點(diǎn)真正“接地氣”的事比如讓 Java 程序精準(zhǔn)獲取當(dāng)前屏幕的 DPI 縮放比例而不是靠GraphicsEnvironment猜比如在用戶最小化窗口時(shí)真正攔截WM_SYSCOMMAND消息并阻止它執(zhí)行比如讀取 Windows 事件日志里某條特定安全審計(jì)記錄的原始二進(jìn)制數(shù)據(jù)比如調(diào)用CryptProtectData對(duì)一段密鑰做系統(tǒng)級(jí)加密再比如把 Java 進(jìn)程注入到另一個(gè)進(jìn)程的地址空間里做深度調(diào)試當(dāng)然僅限合法授權(quán)場(chǎng)景。這些事JDK 自帶的 API 不提供入口JNI 寫起來(lái)又像在刀尖上跳舞——頭文件要手寫、類型映射要手動(dòng)校驗(yàn)、內(nèi)存管理全靠自己扛一個(gè)指針越界就是 JVM 崩潰。這時(shí)候JNA 就不是“可選工具”而是你手里那把能擰開(kāi) Windows 系統(tǒng)保險(xiǎn)柜的萬(wàn)能鑰匙。我第一次用 JNA 是為了給一個(gè)金融交易客戶端加“防截屏”功能??蛻裘鞔_要求當(dāng)檢測(cè)到第三方錄屏軟件如 OBS、Bandicam的窗口句柄活躍時(shí)必須立即模糊主交易界面。這事兒用 Swing 或 JavaFX 的Robot類根本做不到——它們只能截圖不能監(jiān)聽(tīng)系統(tǒng)級(jí)窗口創(chuàng)建事件。最終方案是用 JNA 調(diào)用SetWindowsHookEx(WH_SHELL, ...)注冊(cè)全局鉤子再在回調(diào)函數(shù)里解析HSHELL_WINDOWCREATED消息的LPARAM提取出窗口類名。整個(gè)過(guò)程沒(méi)寫一行 C 代碼所有 Windows API 的結(jié)構(gòu)體定義、函數(shù)聲明、回調(diào)注冊(cè)邏輯全在 Java 里完成。后來(lái)上線半年沒(méi)出過(guò)一次崩潰而隔壁團(tuán)隊(duì)用 JNI 實(shí)現(xiàn)同樣功能的模塊因?yàn)镴NIEnv*在鉤子回調(diào)線程里沒(méi)正確 Attach導(dǎo)致三次 JVM crash dump。核心關(guān)鍵詞Java、JNA、Windows API不是三個(gè)孤立詞而是一條技術(shù)鏈路Java 是你的主戰(zhàn)場(chǎng)JNA 是橋梁Windows API 是你要抵達(dá)的真實(shí)世界。它解決的從來(lái)不是“能不能調(diào)用”的問(wèn)題而是“敢不敢在生產(chǎn)環(huán)境里穩(wěn)定調(diào)用”的問(wèn)題。適合誰(shuí)不是剛學(xué)完ArrayList的新手而是已經(jīng)寫過(guò) 3 個(gè)以上 Spring Boot 項(xiàng)目、遇到過(guò)java.awt.Robot抓不到遠(yuǎn)程桌面畫面、被SystemTray在 Win11 上莫名失效折磨過(guò)的實(shí)戰(zhàn)派。你不需要成為 Windows 內(nèi)核專家但得懂HANDLE和LPVOID的區(qū)別得知道stdcall和cdecl調(diào)用約定對(duì)棧清理的影響得明白為什么WString傳參時(shí)要加MarshalAs(WSTRING)注解——這些細(xì)節(jié)才是 JNA 能否從玩具變成生產(chǎn)武器的分水嶺。2. JNA 的底層邏輯為什么它比 JNI 更“Java”2.1 JNA 不是 JNI 的簡(jiǎn)化版而是另一套運(yùn)行時(shí)契約很多人誤以為 JNA 是 JNI 的語(yǔ)法糖這是最大的認(rèn)知陷阱。JNI 的本質(zhì)是“C 語(yǔ)言主導(dǎo)權(quán)”Java 層通過(guò)native方法聲明接口C 層必須實(shí)現(xiàn)對(duì)應(yīng)函數(shù)JVM 負(fù)責(zé)在調(diào)用時(shí)切換線程上下文、傳遞參數(shù)、處理異常。而 JNA 的契約是“Java 主導(dǎo)權(quán)”你完全在 Java 類里用注解定義 Windows DLL 的函數(shù)簽名JNA 運(yùn)行時(shí)庫(kù)jna.jar在類加載時(shí)動(dòng)態(tài)解析這些注解生成對(duì)應(yīng)的本地調(diào)用樁stub并在運(yùn)行時(shí)通過(guò)VirtualAlloc分配內(nèi)存、LoadLibrary加載 DLL、GetProcAddress獲取函數(shù)地址最后用純 Java 字節(jié)碼模擬函數(shù)調(diào)用過(guò)程。整個(gè)過(guò)程你不用碰 C 編譯器不寫.h文件甚至不知道javah是什么。舉個(gè)具體例子調(diào)用GetSystemMetrics(SM_CXSCREEN)獲取屏幕寬度。用 JNI你需要在 Java 里聲明public static native int getScreenWidth();寫 C 文件實(shí)現(xiàn)JNIEXPORT jint JNICALL Java_MyClass_getScreenWidth(JNIEnv*, jobject)編譯成mylib.dll再用System.loadLibrary(mylib)JVM 啟動(dòng)時(shí)必須確保 DLL 在PATH或java.library.path中而用 JNA你只需要public interface User32 extends StdCallLibrary { User32 INSTANCE Native.load(user32, User32.class); int GetSystemMetrics(int nIndex); } // 調(diào)用int width User32.INSTANCE.GetSystemMetrics(0);JNA 在Native.load()時(shí)自動(dòng)完成 DLL 加載、符號(hào)解析、調(diào)用樁生成。它甚至幫你處理了stdcall調(diào)用約定——Windows API 大部分用stdcall參數(shù)從右往左壓棧被調(diào)用者清理?xiàng)6?Java 默認(rèn)是cdecl調(diào)用者清理?xiàng)?。如果你沒(méi)指定接口繼承StdCallLibraryJNA 會(huì)默認(rèn)用cdecl結(jié)果就是棧被錯(cuò)誤清理后續(xù)函數(shù)調(diào)用全亂套。這個(gè)細(xì)節(jié)90% 的初學(xué)者會(huì)在第一次調(diào)用MessageBoxA時(shí)踩坑。2.2 類型映射Java 和 Windows 的“翻譯官”不是免費(fèi)的JNA 最容易被低估的環(huán)節(jié)是 Java 基本類型與 Windows 類型的映射規(guī)則。這不是簡(jiǎn)單的int→int32_t而是涉及字節(jié)序、內(nèi)存對(duì)齊、指針語(yǔ)義的精密工程。比如HANDLE在 Windows 里是void*但在 JNA 中必須聲明為WinDef.HANDLE繼承自Pointer否則傳參時(shí)會(huì)被當(dāng)作普通int處理導(dǎo)致CloseHandle接收一個(gè)無(wú)效句柄值。再比如LPCWSTR指向?qū)捵址址某A恐羔樤?Java 里必須用WString類型且要加MarshalAs(WSTRING)注解否則 JNA 會(huì)按CStringANSI 字符串編碼中文全變問(wèn)號(hào)。更隱蔽的是結(jié)構(gòu)體對(duì)齊。Windows SDK 的RECT結(jié)構(gòu)體定義是typedef struct _RECT { LONG left; LONG top; LONG right; LONG bottom; } RECT;每個(gè)LONG是 4 字節(jié)理論上sizeof(RECT) 16。但如果你在 Java 里這樣寫public static class RECT extends Structure { public int left, top, right, bottom; protected ListString getFieldOrder() { return Arrays.asList(left,top,right,bottom); } }實(shí)測(cè)size()可能返回 24因?yàn)?JVM 默認(rèn)按 8 字節(jié)對(duì)齊尤其在 64 位系統(tǒng)int字段間會(huì)插入填充字節(jié)。解決方案是顯式聲明ALIGNMENT 4public static class RECT extends Structure { public int left, top, right, bottom; public RECT() { super(Structure.ALIGN_DEFAULT); } protected ListString getFieldOrder() { return Arrays.asList(left,top,right,bottom); } Override protected void setAlignType(int alignType) { super.setAlignType(alignType); } }或者更穩(wěn)妥地直接繼承WinDef.RECTJNA 自帶的已驗(yàn)證結(jié)構(gòu)體。這個(gè)細(xì)節(jié)決定了你的GetWindowRect(hwnd, rect)調(diào)用能否正確返回坐標(biāo)——填充值錯(cuò)位right字段可能被寫入top的內(nèi)存位置。2.3 內(nèi)存模型JNA 的 Pointer 不是 Java 的引用JNA 的Pointer類是理解其內(nèi)存管理的核心。它本質(zhì)上是一個(gè)內(nèi)存地址的包裝器不持有任何 Java 對(duì)象的強(qiáng)引用。當(dāng)你調(diào)用Kernel32.INSTANCE.VirtualAlloc(...)分配一塊內(nèi)存時(shí)返回的Pointer指向操作系統(tǒng)分配的物理頁(yè)但如果你沒(méi)有在 Java 層保存這個(gè)Pointer的引用GC 會(huì)認(rèn)為它“不可達(dá)”下次 GC 時(shí)就可能回收掉這個(gè)Pointer對(duì)象——雖然底層內(nèi)存還在但 Java 里再也找不到它了。更危險(xiǎn)的是JNA 提供的Memory類繼承自Pointer會(huì)自動(dòng)在finalize()里調(diào)用free()但 finalize 時(shí)機(jī)不可控可能導(dǎo)致內(nèi)存提前釋放。真實(shí)案例我曾寫過(guò)一個(gè)模塊用CreateFileMapping創(chuàng)建共享內(nèi)存然后用MapViewOfFile映射到進(jìn)程地址空間。代碼里Memory mem new Memory(size);創(chuàng)建后沒(méi)把它存在成員變量里而是直接傳給MapViewOfFile。結(jié)果在高并發(fā)下GC 頻繁觸發(fā)mem對(duì)象被回收MapViewOfFile返回的指針指向已釋放內(nèi)存后續(xù)讀寫直接引發(fā)EXCEPTION_ACCESS_VIOLATION。修復(fù)方案很簡(jiǎn)單把Memory實(shí)例作為類的私有字段長(zhǎng)期持有并在close()方法里顯式調(diào)用mem.free()。這提醒我們JNA 的內(nèi)存必須用 Java 的引用計(jì)數(shù)邏輯來(lái)管理不能依賴“自動(dòng)釋放”。3. 實(shí)戰(zhàn)拆解用 JNA 實(shí)現(xiàn) Windows 系統(tǒng)級(jí)音量控制3.1 需求分析為什么標(biāo)準(zhǔn) Java Audio API 不夠用Java 的javax.sound.sampled包能播放音頻、錄制麥克風(fēng)但它無(wú)法控制系統(tǒng)的主音量滑塊也不能單獨(dú)調(diào)節(jié)某個(gè)應(yīng)用程序如 Chrome、微信的音量。這是因?yàn)?Windows 的音量控制屬于“會(huì)話音頻策略”Session Audio Policy由 Windows Core Audio APIs 管理這套 API 從 Vista 開(kāi)始取代了舊的waveOut系列核心是IAudioEndpointVolume和ISimpleAudioVolume接口。它們基于 COMComponent Object Model而 JNA 對(duì) COM 的支持是通過(guò)com.sun.jna.platform.win32.COM包實(shí)現(xiàn)的本質(zhì)是用 JNA 封裝了CoInitialize、CoCreateInstance等 COM 基礎(chǔ)函數(shù)。我們的目標(biāo)寫一個(gè) Java 工具能獲取當(dāng)前默認(rèn)播放設(shè)備的總音量0.0~1.0設(shè)置總音量為指定值如 0.75獲取/設(shè)置 Chrome 瀏覽器進(jìn)程的獨(dú)立音量需識(shí)別其 Audio Session這個(gè)需求直擊痛點(diǎn)很多企業(yè)內(nèi)部系統(tǒng)需要根據(jù)會(huì)議狀態(tài)自動(dòng)靜音/恢復(fù)音量而Runtime.getRuntime().exec(nircmd.exe setsysvolume 32768)這種外部命令調(diào)用既不安全需管理員權(quán)限又無(wú)法精確控制單個(gè)應(yīng)用。3.2 核心接口定義從 Windows SDK 到 Java 的逐行翻譯第一步定義 COM 接口。Windows SDK 中IAudioEndpointVolume的 IID 是{1be09788-f645-4fb9-85ea-70a9a8b8d84c}方法列表在IAudioEndpointVolume.h里。JNA 要求我們用 Java 接口繼承Com4jObject并用IID注解標(biāo)注public interface IAudioEndpointVolume extends IUnknown { IID({1be09788-f645-4fb9-85ea-70a9a8b8d84c}) public static final String IID {1be09788-f645-4fb9-85ea-70a9a8b8d84c}; // HRESULT GetMasterVolumeLevelScalar(float *pfLevel); int GetMasterVolumeLevelScalar(FloatByReference pfLevel); // HRESULT SetMasterVolumeLevelScalar(float fLevel, LPCGUID pguidEventContext); int SetMasterVolumeLevelScalar(float fLevel, GUID pguidEventContext); // HRESULT GetMute(BOOL *pbMute); int GetMute(IntByReference pbMute); // HRESULT SetMute(BOOL bMute, LPCGUID pguidEventContext); int SetMute(int bMute, GUID pguidEventContext); }注意幾個(gè)關(guān)鍵點(diǎn)FloatByReference是 JNA 提供的包裝類對(duì)應(yīng) C 的float*用于輸出參數(shù)。IntByReference對(duì)應(yīng)BOOL*Windows 的BOOL是 4 字節(jié)整數(shù)非 Java 的 boolean。GUID是 JNA 自帶的結(jié)構(gòu)體必須用new GUID(...)初始化不能用String。所有方法返回int即 HRESULT 值0 表示成功負(fù)數(shù)表示錯(cuò)誤如0x80004005是 E_FAIL。第二步定義IMMDeviceEnumerator接口用于枚舉音頻設(shè)備public interface IMMDeviceEnumerator extends IUnknown { IID({A95664D2-9614-4F35-A746-DE8DB63108CB}) public static final String IID {A95664D2-9614-4F35-A746-DE8DB63108CB}; int EnumAudioEndpoints(int dataFlow, int dwStateMask, ByReference ppDevices); }這里dataFlow參數(shù)是EDataFlow枚舉需自己定義public interface EDataFlow { int eRender 0; // playback int eCapture 1; // recording }3.3 完整調(diào)用鏈從初始化 COM 到控制音量完整流程分五步每一步都有陷阱Step 1初始化 COM 庫(kù)// 必須在主線程調(diào)用且每個(gè)線程只能調(diào)用一次 int hr Ole32.INSTANCE.CoInitializeEx(null, Ole32.COINIT_APARTMENTTHREADED); if (hr ! 0 hr ! S_OK hr ! S_FALSE) { throw new RuntimeException(CoInitializeEx failed: hr); }COINIT_APARTMENTTHREADED是關(guān)鍵Windows Core Audio 要求 STASingle Threaded Apartment線程模型如果用COINIT_MULTITHREADED后續(xù)CoCreateInstance會(huì)返回CLASS_E_NOAGGREGATION錯(cuò)誤。Step 2創(chuàng)建設(shè)備枚舉器IMMDeviceEnumerator enumerator null; try { enumerator (IMMDeviceEnumerator) Ole32.INSTANCE.CoCreateInstance( new GUID({BCDE0395-E52F-467C-8E3D-C4579291692E}), // __uuidof(MMDeviceEnumerator) null, CLSCTX_INPROC_SERVER, new GUID(IMMDeviceEnumerator.IID), IMMDeviceEnumerator.class ); } catch (Exception e) { throw new RuntimeException(Failed to create IMMDeviceEnumerator, e); }CLSCTX_INPROC_SERVER表示在當(dāng)前進(jìn)程內(nèi)加載 COM 組件這是最常用且最穩(wěn)定的選項(xiàng)。Step 3獲取默認(rèn)播放設(shè)備IMMDevice device null; try { device enumerator.GetDefaultAudioEndpoint(EDataFlow.eRender, ERole.eConsole); } catch (Exception e) { throw new RuntimeException(Failed to get default audio endpoint, e); }ERole.eConsole表示“多媒體”角色對(duì)應(yīng)用戶設(shè)置的默認(rèn)播放設(shè)備。如果要獲取“通信”角色如視頻會(huì)議專用設(shè)備用eCommunications。Step 4激活音量控制接口IAudioEndpointVolume volume null; try { volume (IAudioEndpointVolume) device.Activate( new GUID(IAudioEndpointVolume.IID), CLSCTX_INPROC_SERVER, null ); } catch (Exception e) { throw new RuntimeException(Failed to activate IAudioEndpointVolume, e); }device.Activate()是 COM 的核心方法它根據(jù) IID 創(chuàng)建對(duì)應(yīng)接口實(shí)例。這里null表示不傳遞激活參數(shù)。Step 5讀寫音量值// 獲取當(dāng)前音量 FloatByReference levelRef new FloatByReference(); int hr volume.GetMasterVolumeLevelScalar(levelRef); if (hr ! 0) { throw new RuntimeException(GetMasterVolumeLevelScalar failed: hr); } float currentLevel levelRef.getValue(); // 0.0 ~ 1.0 // 設(shè)置新音量 hr volume.SetMasterVolumeLevelScalar(0.75f, new GUID()); // GUID() 生成空 GUID if (hr ! 0) { throw new RuntimeException(SetMasterVolumeLevelScalar failed: hr); }new GUID()是關(guān)鍵pguidEventContext參數(shù)用于音量變更事件的上下文標(biāo)識(shí)傳null會(huì)導(dǎo)致E_POINTER錯(cuò)誤必須傳一個(gè)有效的GUID實(shí)例。3.4 進(jìn)階控制單個(gè)應(yīng)用程序音量ISimpleAudioVolume要控制 Chrome 的音量需獲取其 Audio Session。Windows 用IAudioSessionManager2管理會(huì)話流程如下通過(guò)IMMDevice獲取IAudioSessionManager2實(shí)例調(diào)用GetSessionEnumerator()得到IAudioSessionEnumerator遍歷所有會(huì)話用GetSessionControl()獲取IAudioSessionControl調(diào)用GetDisplayName()或GetIconPath()識(shí)別進(jìn)程名實(shí)際中更可靠的是GetProcessId()用QueryInterface()查詢ISimpleAudioVolume接口難點(diǎn)在于進(jìn)程識(shí)別GetDisplayName()返回的是會(huì)話名稱如 “Google Chrome”但可能被用戶修改。最穩(wěn)的方式是int pid sessionControl.GetProcessId(); // 然后用 Kernel32.INSTANCE.OpenProcess(...) 獲取進(jìn)程句柄 // 再用 Psapi.INSTANCE.GetModuleFileNameExA(...) 讀取主模塊路徑 // 最后比對(duì)路徑是否包含 chrome.exe這段代碼需要額外加載Psapi.dll并定義GetModuleFileNameExA函數(shù)。這就是 JNA 的威力——你可以在同一個(gè) Java 項(xiàng)目里無(wú)縫組合ole32.dll、kernel32.dll、psapi.dll的調(diào)用像拼樂(lè)高一樣構(gòu)建系統(tǒng)級(jí)能力。4. 高頻問(wèn)題排查與避坑指南那些讓你加班到凌晨的細(xì)節(jié)4.1 “No matching function found” 錯(cuò)誤簽名不匹配的隱形殺手這是 JNA 新手最常遇到的錯(cuò)誤表面看是函數(shù)找不到根源往往是類型或調(diào)用約定不匹配。例如調(diào)用FindWindowAUser32.INSTANCE.FindWindowA(null, Notepad);如果報(bào)錯(cuò)No matching function found for User32.FindWindowA檢查點(diǎn)有三個(gè)DLL 名稱User32.INSTANCE是Native.load(user32, ...)創(chuàng)建的但FindWindowA在user32.dll中名稱沒(méi)錯(cuò)。參數(shù)類型FindWindowA第二個(gè)參數(shù)是LPCSTRANSI 字符串Java 里必須用StringJNA 默認(rèn)按CString編碼不能用WString那是FindWindowW的參數(shù)。調(diào)用約定FindWindowA是stdcall所以接口必須繼承StdCallLibrary。如果繼承Library默認(rèn)cdecl就會(huì)報(bào)此錯(cuò)。實(shí)操技巧用 Dependency Walkerdepends.exe打開(kāi)user32.dll查看FindWindowA的導(dǎo)出符號(hào)確認(rèn)它是stdcall符號(hào)名以結(jié)尾如FindWindowA8而cdecl函數(shù)名無(wú)修飾如printf。這是快速驗(yàn)證調(diào)用約定的土辦法。4.2 “Access is denied” 錯(cuò)誤UAC 和權(quán)限的無(wú)聲壁壘調(diào)用AdjustTokenPrivileges提升進(jìn)程權(quán)限或OpenProcess打開(kāi)其他進(jìn)程句柄時(shí)常遇到ERROR_ACCESS_DENIED (5)。這不是 JNA 的 bug而是 Windows UACUser Account Control的硬性限制。解決方案分三層基礎(chǔ)層確保 Java 進(jìn)程以管理員身份運(yùn)行。在 IntelliJ IDEA 里右鍵菜單選擇 “Run as Administrator”在命令行用runas /user:Administrator java -jar myapp.jar。API 層調(diào)用OpenProcess時(shí)dwDesiredAccess參數(shù)不能盲目設(shè)PROCESS_ALL_ACCESS0x1FFFFF這需要SeDebugPrivilege權(quán)限。應(yīng)按需申請(qǐng)最小權(quán)限如PROCESS_QUERY_INFORMATION | PROCESS_VM_READ0x410。COM 層某些 COM 接口如IAudioSessionManager2在低完整性級(jí)別Low IL進(jìn)程里無(wú)法激活。解決方案是調(diào)用ShellExecute以中等完整性啟動(dòng)新進(jìn)程或在 manifest 文件中聲明requireAdministrator。經(jīng)驗(yàn)我在開(kāi)發(fā)一個(gè)進(jìn)程監(jiān)控工具時(shí)發(fā)現(xiàn)EnumProcesses總是返回 0 個(gè)進(jìn)程。用 Process Explorer 查看發(fā)現(xiàn) Java 進(jìn)程的 Integrity Level 是 “Low”而系統(tǒng)進(jìn)程是 “Medium”。最終在src/main/resources/META-INF/MANIFEST.MF里添加Windows-Application-Model: true Windows-Application-Model-Execution-Level: requireAdministrator并用mt.exe工具嵌入 manifest問(wèn)題解決。4.3 內(nèi)存泄漏Pointer 和 Callback 的雙重陷阱JNA 的內(nèi)存泄漏通常有兩種模式未釋放的 VirtualAlloc 內(nèi)存調(diào)用Kernel32.INSTANCE.VirtualAlloc分配內(nèi)存后忘記調(diào)用VirtualFree。JNA 不會(huì)自動(dòng)回收因?yàn)閂irtualAlloc分配的是操作系統(tǒng)頁(yè)不是 JVM 堆內(nèi)存。未注銷的 Windows Hook用SetWindowsHookEx注冊(cè)WH_KEYBOARD_LL鉤子后程序退出時(shí)沒(méi)調(diào)用UnhookWindowsHookEx。這會(huì)導(dǎo)致鉤子句柄泄露系統(tǒng)資源耗盡后新鉤子無(wú)法注冊(cè)。避坑技巧用try-with-resources模式封裝資源。例如public class AutoCloseablePointer implements AutoCloseable { private final Pointer pointer; private final Runnable freeAction; public AutoCloseablePointer(Pointer p, Runnable freeAction) { this.pointer p; this.freeAction freeAction; } Override public void close() { if (pointer ! null freeAction ! null) { freeAction.run(); } } } // 使用 try (AutoCloseablePointer mem new AutoCloseablePointer( Kernel32.INSTANCE.VirtualAlloc(null, size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE), () - Kernel32.INSTANCE.VirtualFree(mem.pointer, 0, MEM_RELEASE) )) { // use mem.pointer }對(duì)于 Hook注冊(cè)后保存HHOOK句柄在shutdownHook里統(tǒng)一注銷HHOOK hook User32.INSTANCE.SetWindowsHookEx(WH_KEYBOARD_LL, keyboardProc, hInstance, 0); Runtime.getRuntime().addShutdownHook(new Thread(() - { if (hook ! null) { User32.INSTANCE.UnhookWindowsHookEx(hook); } }));4.4 字符編碼亂碼ANSI vs Unicode 的千年戰(zhàn)爭(zhēng)Windows API 有AANSI和WUnicode兩個(gè)版本如MessageBoxA和MessageBoxW。JNA 默認(rèn)優(yōu)先調(diào)用W版本但如果 DLL 沒(méi)導(dǎo)出W版本某些老舊 DLL就會(huì)失敗。解決方案顯式指定函數(shù)名User32.INSTANCE.MessageBoxA(hwnd, Hello, Title, MB_OK);強(qiáng)制使用 ANSI在Native.load()時(shí)傳Collections.singletonMap(Library.OPTION_STRING_ENCODING, GBK)統(tǒng)一用 Unicode所有字符串用WString并確保 DLL 支持W版本現(xiàn)代 Windows 系統(tǒng)都支持真實(shí)案例調(diào)用ShellExecuteA打開(kāi)含中文路徑的 PDF 文件路徑顯示為亂碼。原因是ShellExecuteA用 ANSI 編碼而 Java 字符串是 UTF-16。修復(fù)改用ShellExecuteW參數(shù)全用WStringShell32.INSTANCE.ShellExecuteW( null, new WString(open), new WString(C:\\文檔\\報(bào)告.pdf), null, null, SW_SHOW );4.5 JVM CrashJNI 與 JNA 的共存雷區(qū)當(dāng)項(xiàng)目里同時(shí)存在 JNI 和 JNA 代碼時(shí)最容易引發(fā) JVM 崩潰。根本原因是 JNI 的JNIEnv*指針在線程間不通用而 JNA 的回調(diào)函數(shù)如 Windows Hook 的LowLevelKeyboardProc可能在非 JVM 線程里執(zhí)行。如果回調(diào)里調(diào)用了 JNI 函數(shù)如env-FindClass就會(huì)因JNIEnv*無(wú)效而 crash。解決方案只有兩個(gè)絕對(duì)禁止在 JNA 回調(diào)里調(diào)用任何 JNI 函數(shù)。所有 JNI 邏輯必須在 JVM 線程里執(zhí)行。用 JNA 的Callback機(jī)制將任務(wù)轉(zhuǎn)回 Java 主線程public interface KeyboardHookCallback extends StdCallCallback { int callback(int nCode, WPARAM wParam, LPARAM lParam); } KeyboardHookCallback callback (nCode, wParam, lParam) - { // 這里只做輕量工作如記錄日志 System.out.println(Key pressed); // 重任務(wù)提交到 SwingUtilities.invokeLater 或 ExecutorService executor.submit(() - heavyWork()); return User32.INSTANCE.CallNextHookEx(hHook, nCode, wParam, lParam); };5. 工具鏈與工程化實(shí)踐讓 JNA 項(xiàng)目走出玩具階段5.1 Maven 依賴與版本鎖定別讓 JNA 成為版本炸彈JNA 的版本兼容性極差。jna-5.12.1能完美調(diào)用user32.dll但升級(jí)到j(luò)na-5.13.0后SetWindowsHookEx可能返回NULL。原因在于 JNA 內(nèi)部對(duì)Callback的線程模型做了重構(gòu)。因此工程化第一原則固定 JNA 版本禁用版本范圍。正確配置dependency groupIdnet.java.dev.jna/groupId artifactIdjna/artifactId version5.12.1/version !-- 嚴(yán)格鎖定 -- /dependency dependency groupIdnet.java.dev.jna/groupId artifactIdjna-platform/artifactId version5.12.1/version !-- 必須與 jna 版本一致 -- /dependencyjna-platform提供了WinDef、WinUser、Ole32等預(yù)定義接口省去大量重復(fù)勞動(dòng)。但要注意它的更新滯后于 Windows SDK某些新 API如 Win11 的IAppActivationManager需自行定義。5.2 接口定義工程化用模板生成代替手寫手寫IAudioEndpointVolume這樣的接口效率低下且易錯(cuò)。推薦用 JNAerator 工具它能解析 Windows SDK 的.h文件自動(dòng)生成 Java 接口。例如下載 Windows SDK 的audioclient.h運(yùn)行java -jar jnaerator.jar -libraryName CoreAudio -o src/main/java com.microsoft.windows.coreaudio.audioclient.h生成的代碼需人工審核重點(diǎn)檢查#define常量是否轉(zhuǎn)為public static final intstruct是否正確映射為Structure子類HRESULT返回值是否統(tǒng)一為int我維護(hù)的 JNA 接口庫(kù)已積累 200 個(gè) Windows API 接口定義全部按模塊組織win32/,com/,coreaudio/并通過(guò)單元測(cè)試驗(yàn)證基本調(diào)用。這種沉淀讓新項(xiàng)目接入 Windows 功能的時(shí)間從 2 天縮短到 2 小時(shí)。5.3 單元測(cè)試用 TestContainers 模擬 Windows 環(huán)境JNA 代碼無(wú)法用純 Java 單元測(cè)試覆蓋因?yàn)橐蕾囌鎸?shí) DLL。解決方案是用 TestContainers 啟動(dòng) Windows Docker 容器Test public void testGetSystemMetrics() { try (GenericContainer? windows new GenericContainer(mcr.microsoft.com/windows/servercore:ltsc2022) .withExposedPorts(22) .withClasspathResourceMapping(test-script.ps1, /test.ps1, BindMode.READ_ONLY) .withCommand(powershell -ExecutionPolicy Bypass -File /test.ps1)) { windows.start(); // 通過(guò) SSH 或 WinRM 執(zhí)行 PowerShell 腳本驗(yàn)證 JNA 調(diào)用結(jié)果 } }更輕量的方案是用junit-platform-launcher的EnabledOnOs(OS.WINDOWS)注解只在 Windows CI 環(huán)境運(yùn)行 JNA 測(cè)試避免 Linux/macOS 上跳過(guò)測(cè)試的尷尬。5.4 生產(chǎn)環(huán)境加固異常處理與降級(jí)策略JNA 調(diào)用失敗是常態(tài)必須設(shè)計(jì)降級(jí)。例如調(diào)用GetDpiForWindow獲取 DPI 時(shí)若 Windows 版本低于 10.0.14393該函數(shù)不存在應(yīng)降級(jí)為GetDeviceCaps(HORZRES)public static int getDpiForWindow(HWND hwnd) { try { // 嘗試新 API return User32.INSTANCE.GetDpiForWindow(hwnd); } catch (UnsatisfiedLinkError e) { // 降級(jí)到舊 API HDC hdc User32.INSTANCE.GetDC(hwnd); int dpi Gdi32.INSTANCE.GetDeviceCaps(hdc, LOGPIXELSX); User32.INSTANCE.ReleaseDC(hwnd, hdc); return dpi; } }所有 JNA 調(diào)用必須包裹try-catch捕獲UnsatisfiedLinkErrorDLL 未找到、LastErrorExceptionWindows 錯(cuò)誤碼、RuntimeExceptionJNA 內(nèi)部錯(cuò)誤。日志里記錄Native.getLastError()的值方便定位問(wèn)題。最后分享一個(gè)血淚教訓(xùn)某次上線后用戶反饋音量控制失效。日志顯示CoCreateInstance返回REGDB_E_CLASSNOTREG0x80040154。排查發(fā)現(xiàn)目標(biāo)機(jī)器是 Windows Server 2012 R2而IAudioEndpointVolume在 Server 版本默認(rèn)禁用音頻服務(wù)。解決方案不是改代碼而是寫部署文檔“請(qǐng)確保 Windows Audio 服務(wù)已啟動(dòng)”。技術(shù)再牛也得尊重操作系統(tǒng)的基本約束。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
久久亚洲不卡一区二区三区 | 蜜乳Av成人片网站| 国产亚洲精品无码三区| 精品一区二区成人| 亚洲色性情三级| 超碰在线91| 国产精品白丝在线播放 | 丁香五月天婷婷姐| 亚洲日韩久久精品一区| 九热久| 亚洲欧美在线丝袜| 日韩免费三级黄片电影| 婷婷五月天激情四射| 久插综合| 国模私拍一区二区三区神乳| 色色色综合网| 91社区拍啪人妻| 神马久久久久久久久久久久| 激情色图| 97色97好| 亚洲自拍欧美国产首页网曝| 精品国产嫩穴视频| 91天天| 亚洲欧美色图小说| 久久国产99精品72福利| 91狠狠狠| 色乱二区| 日韩av色图综合| 五码视频在线观看| 国产美女激情| 国产精品白领在线观看| 精品妇女一区二区三区| 啊啊啊啊好疼| 青久操| 亚洲天堂区| 最新av在线| 中日韩久久久| 99精品九九九九九九| 91碰超| 蜜奶av| 婷婷五月天色| 农村妇女精品一区二区| 国产精品福利资源在线尤物| 精品无码一区二区| 国产传媒日韩| 综合网色| 中文字幕在线免费观看| 亚洲天堂电影精品一区| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师黑人潮喷一 | 亚洲熟女乱综合一区二区三区| 久久久久国产精品久久久| 91久青| h4610国产人妻| 人妻精品一区二区全免费| 日本三级一区二区 在线| 蜜臀av网址| 在线观看亚洲专区| 600国产精品视频| av午夜玫瑰| 欧美91丝袜| 人人操 欧美| 美欧老女人97| 亚洲少妇自拍中文字幕懂色| 玖玖资源视频一区二区三区| 99re国产中文字幕| 精品玖九九久| 校园春色中文字幕AV| 五月丁香综合| 综合网天天| 欧美激情亚洲情色| 亚洲欧美国产其他二区| 91宗合网| 亚洲性综合| 欧美老熟另类| 在线 亚洲 网爆 自拍| 亚洲免费人妻在| 99re99| 中国国国产一级特黄毛片| 五月丁香啪啪啪| 日本精品五区| 久久啊啊| 精品国产a∨一区天美传媒| 欧美男人一区| 五月婷婷影院| 99精品在线| 日韩在线性爱免费视频| AAAAAAAAA黄片| 亚洲欧洲激情| 人妻酒店出差被中出免费在线播放| 三级片网站在线播放| 日日操天天操| 九九热精品| 久久毛卡| 搡老女人老妇女AAA一VU麻豆| 亚洲牲交| 91网站18禁| 超碰九九| 激情欧美日韩女同久久| 久久夜嗨| 日欧毛片久久| AV男人天堂网| 亚洲性猛交| 色五月av| 丁香五月婷婷啪啪| 黄页大片在线观看| 欧美 亚洲 制服 精品| 91黑人无码激情在线| 亚洲成人激情小说视频| 97在线视频观看| 999999精品| 精品久| 欧色网址| 日本色色色网站免费看不卡| 九一性生活免费视频| 青青草在线成人视频| 久九九九九九九热| 亚洲精品819| 欧美午夜精品久久久久久超碰| 色色丁香| 91大神电影天堂| 欧洲免费一区二| 日本天堂网| 天天做天天爱天天爽AV| 亚洲熟妇综合久久久久久| 啊啊啊啊好疼视频| 欧美综合综合| 婷婷久久五月综合激情| 色五天伊人| 欧美国产伊人久久久久| 蜜臀网 一区| 91bbbbbb| 色婷婷六月丁香七月婷婷| 激情五月综合开心五月| 欧美系列在线一区二区| 久久露脸国产老熟女| 欧美亚洲日韩人妻在线观看| 嗯啊不要啊啊在线观看视频| 激情一区二区三区在线观看| 日本不卡码黄色| 日韩精品9999| 在线天堂资源亚洲| 69视频入口| 欧美乱欲| 口爆吞精在线观看| 亚洲美欧999| juliaann精品熟女一区| 嗯~啊~轻一点 视频| 十八禁啪啪视频| 欧美黄片免费在线观看视频| 久久怡红院| 欧美一区二区在线资源| 天天碰久久入| 超碰国产精品无码| 日日夜夜干| 少妇500双飞99| 职场同事知名国产国产精品久久欧美日韩| 网友自拍第1页| 丰满岳乱妇一区二区三区| 中字乱伦AV| 欧美性暴力猛交XXXX| 久9爱精品| 99国产精品视频尤物| 色色婷婷丁香| 国产精品久久久九九九| 啊啊好多水| av日韩中文字幕| www.亚洲成人一区| 长长久久免费视频| 九九九偷拍| 国产欧美精选自拍一区| 国产九九久久久精品| 一区二区亚州激情久婷婷欧美| www.狠狠| 天天综合色图| 91国精产品| 男女激情黄色网址| 夜夜操av亚洲一区二区| 加勒比色99999| 黄色在线网站| 欧美曰韩国产精品| 日韩欧美加勒比| 强奸乱伦动态污图免费 | 熟妇熟女视频一区二区三区| 不卡一区视频| heyZO天然素人无码AⅤ专区| 9999伦理视频| 无码 黑人一区二区三区| 久操大香蕉手机视频在线看| 蜜臀网 一区| 日韩欧亚太美不卡| 99久久久久久久久| 综合大香蕉美。| 熟女91网| 在免费jIzzjIzz在线视频| 美腿丝袜偷拍亚洲欧美| 日韩激情电影中文字幕| 97资源超碰| 清纯唯美综合| 91大学精品激情戏| 狠狠爱大香蕉| h4610国产人妻| 欧美日韩青操| 日本精品中文字幕视频| 超碰天天久久79| 国产精品懂色tv影视免费观看| 涩五月婷婷| 蜜臀久久99精品久久久久久成人小说 | 好舒服视频| 欧美午夜视频免费观看| 亚洲久热| 一二三区操逼国产91| 欧美第一页性| 97超碰精品图片| 丁香五月天激情综合| 久久久性爱| 红杏大香蕉| 亚洲丝袜综合| 夜夜操2028| 中文字幕欧美丝袜07资源| 男人天堂2012| 新久久AV| 超碰精品日韩欧美国产| 丝袜综合色图| 欧美精品xxxwww| 青青草玖玖爱| 五月花婷婷| 老女人综合网| 东京热精品97综合网| 高潮的A片激情扒开一区| 足交视频老司机| 亚洲 欧美 手机在线观看| 熟女丝袜视频| 约操熟妇| 91第一页| wwwxxx日本爽| 日本91白丝| 国产亚洲日本| 天天流夜夜操| 3028国产精品| 久久曰曰| 九九九九免费高| 亚洲第一在线视频| 热思思免费视频| 午夜综合在线| 大鸡巴久久久| 国产精品久久久久久久久AV大片| 六月丁香五月婷婷| 欧洲视频在线| 96精品久久久久久久久久| 中文字幕一区二区在线日韩精品| 久久亚洲日韩国产欧| 蜜臀久久99精品久久久老,,| 亚欧成人综合影院| 不卡在线观看视频| 日韩av电影网站| 1024亚洲中文字幕久在线看片你懂的 | 日韩偷拍色图| 免费人成?大片在线播放| 久久AV无码AV| 一区二区播放| 天天澡天天爽日日av| 亚洲成人免费电影| 国产精品久久99日日| 亚洲人久久久久日| 四虎精品永久在线观看| 一区,二区,三区视频| 99精品免费| 深夜国产一区二区三区在线看| 久久一区二区蜜桃| 国产免费小视频| 人人弄人人摸| 日本不卡一二区| 新精精品久久精品| 日韩 成人 有码| 肉丝网站91| 婷婷五月花| 亚洲免费人妻在| 久久国产乱子伦精品免费女人| 偷拍综合网| 伊人九九九| 大色网久久| 久艹99| 日韩不卡一二三四| 久草热制服丝袜在线观看| 99啪啪视频| 麻豆天美电影一区二区| 麻豆 欧美 日韩| 一区二区激情国产熟女| 中文字幕二区日韩天堂| 中文字幕在线观看丝袜| 好色美女九七第一页| 沈阳熟女高潮对白视频| 91挑色欧美| 久插综合| 精品97久久综合| 久久精品老司| 久久精品99久久久久久| 日影院久久婷婷夜夜网| 天美传媒av一区二区| 情侣操 逼视频99| 久久精品人妻一区二区| 久久综合久色欧美综合狠狠 | 亚洲综合婷婷| 久久精彩免费视频| 99热97| 久久极品伊人| 色综合久久久久| 五月综合久久| 亚州操操穴网| 青青草成人视频在线观看二区| 三上制服丝AV| 色欲天香天天综合网-成年人三级片网站-欧美乱妇狂野-日韩国产专区-久久久久久 | 午夜精品久久一区二区| 亚洲色图欧洲| 久久一二三四五六七八九区| 成人草草视频| …亚洲黄色厕厕女女在线播…| 九九热国产| 免费精品无码一级毛片牛牛影视 | 在线亚洲丝袜视频网站| 久久机热| 啊啊啊想要| 中日韩免费看男女操逼大全| 成人日韩3| 亚洲经典啪啪| 青青草在线成人视频| 91美女在线视频| 中文字幕精品专区搜索结果91| 九九热午夜欧亚国产视频| 九九九成人| 人人弄人人摸| 五月丁香网站| 欧美色图下一页| 中文字幕免费在线观看| 翔田千里AV无码秘 三区| 亚洲国产青青| 欧姜老司机| 强被迫伦姧在线观看无码网站| 欧美经典一区二区三区| 极品色社| 欧美在线中M| 麻豆视频一区二区| 欧美黑人精品一区二区| 精品视频123区小说区| 夜夜 中文视频rt| 国产日韩怡红院| 国产精品亚洲无码| 久久久久久大| 变态另类专区| 久久直播国产| 男人天堂资源| 最近2019中文字幕国语免费版| 资源在线观一 二| 91丨精品丨国产丨丝袜| 国产精品精品系列在线观看| 97综合在线| 亚洲成人精品久久久| 精品97久久| 91精品女厕偷拍视频| 欧美精品另类人妖xxxx| 限制级中的三级片中的黑粗大屌屌日人妻熟女| 精品欧美不卡在线播放| 69人妻精品一区二区绯色| 天天操天天日天天干| 一区二区中文| 91蜜臀熟女| 国产三级中文字幕粉嫩| 亚洲第一免费视频| 成人五月天色网| 高清有码一区二区| renqi久久久久久久久久久久| 九九九热精品| 久久久久久国产无码精品| 日韩 人妻 精品| 色欧美综合| 4399成人黄A片| 狠狠爱AV| 99久久久er直播网址| 精品久久人妻成人网| 91爱做| 草草草视频在线免费看| 免费视频无码| 91亚洲欧洲| 在线免费观看日韩一区| 四虎免费在线播放| 亚洲成人妻日韩在线| 国产av青草| 啊啊啊啊啊好多水| 天天射,天天操,天天爽-国内精品一区二区三区-成人AV | 人妻久久| 污啪啪啪视频| 国产精品视屏| 香蕉99秘 精品一区丁香| 欧美亚洲首页| 色香阁在线| 91oumei| 日比av无码| 日日夜夜干| 日韩精品影视| 免费看久久久性性| 操淫穴亚洲五月丁香| 一起草日韩| 骚女高跟AV在线| 欧美大香蕉专区网| 成人性交午夜免费片| 9九九九九视频在线观看| 神马麻豆福利院| 中文字幕一区av| 免费观看日本操逼视频| 黄色不卡视频| 国产67194| 2019天天干| 蜜臀在线免费观看在线免费观看| 亚洲精品一二区| 成人久久久精品| 岛国精品视频在线观看| 麻豆美女丝袜人妻中文| 国产美女91视频| 成人5码视频| 综合网少妇| 亚洲精品97在线| 日韩三A大片在线观看| 久久国语| 亚洲熟妇自偷自拍另欧美| 免费岛国一级片| 亚洲男人的天堂网| 91九色精品熟女内射| 午夜性刺激视频免费观看| 大香蕉天天看妹子| 91free福利| 免费试看60秒| 少妇蹲下买菜露大唇0| 亚洲天堂,男人| 波多野结衣被操50分钟免费视频| 久久亚洲日韩熟女精品| 久9久9精品| 色婷婷丁香五月天| 人妻少妇被猛烈进入中| 美女久久久久久久久久久| 五月婷婷hd| 大香蕉九九| 一区二区三区激情在线观看| 中文精品一区二去| 日韩一级片在线看| 日本不卡二区| 91激情国产| 黄色成品网站| 久久午夜伦| 国产91啪| 久久受www免费人成| 91制服丝袜| 曰本91情色| 丁香五月激情综合| 欧美强奸乱能| 欧美97| 天天性射网| 自拍视频大全亚洲专媒视频/一区二区三区 | 人人喜人人妻| 十八禁视频一区二区| 日日日啊啊啊| 91人妻熟女| 玖玖人人爱| 日日日日做夜夜夜夜做无码97| 3P乱轮视频| 精品一区二区三区国产| 青青草公开在线免费不卡视频| 超碰人妻中文在线| 九九热超碰97亚洲最新香蕉| 欧美日韩丝袜| 三级三级三级日本99| 强奸乱伦αv片| 性爱视频无打码在线观看| 曰韩中文人妻视频| 美女久久久久久久久久久| 九九九九一区| 在线洲亚线| 风月影院男女十八禁| 91夜夜蜜桃臀1区2区3区| ai欧美亚洲小说| 日韩伦理久 久久 清纯 | 人妻天天爽夜夜爽精品2| 超碰在线看| 搡老熟女老女人老熟妇免费视频| 欧美人妻久久精品二区三区| 日本熟女免费視颖| 免费一级a毛片久久久久久鸭绿欲| 牛牛AV人人夜夜澡人人爽| 熟妇一区二区| 老司机福利青青草| 人人喜人人妻| 久久综合久久综合人久久夜精品| 极品粉嫩一区二区| 久艹伊人精品综合在线| 色女99一级片在线观看| 躁躁日曰躁2020| 亚洲第91页| 蜜桃一区二区三区| 激情婷婷丁香网| 欧美第五页| 97人人爱人人乐| 伊人超碰97| 亚洲九九九| 91精品微拍福利| 一二三四视频中文字幕在线看| 亚洲一区操| 免费一级特黄特色大片在线观看看| 久久av一级av少妇av高潮| 久久毛卡| 色色无码| 伦理弟一页| 99re在线视频这里只有精品| 欧美色九九| 色吧5亚洲| 日日插夜夜| 亚洲精品日韩国产欧美| 无码99| 妇人噜噜| 久草综合网| 午夜精品久久一区二区| 把腿张开老子CAO烂你| 五月丁香激情综合网| 精品久久在线区一区| 日日夜夜噜| 老鸭窝在线视频播放| 久热一区二区| 中国zzijzzijzzwww精品| 婷婷久久网| 日韩天堂av电影在线观看| 日日干夜夜欢| 婷婷超| 亚洲欧洲日韩国产自在线| 色激情五月天| 日日夜夜模| 97超碰色色| a片在线播放| 91爽啪| 日本幼女18+| 国产精品制服丝袜清纯唯美| 青青11操操操操操操操操| 国产无码精品久久久久久| 国产av激情无码久久天堂| 午夜福利视频在线一区| 国产精品国产自产拍高清AV| av日韩中文字幕| 最新亚洲黄色免费电影| 亚洲AV无码成人精品久久| 日本三级小说中文字幕| 91少妇通奸网站| 亚洲欧美91| 中文字幕日韩电影人妻| 又大又白奶子| 欧美,日韩,中文,另类| jizz啪啪| 亚洲欧美大| 亚洲黄a三级三级三级看三级| 97综合久久| 丁香五月性| 久草精品视频| 九九热九九| 亚欧成人综合影院| 午夜精品久久久久久久99热影院| 大香蕉99999| 黄色免费网| 国产视频不卡在线观看| 国产人妻一区二区三区欧美毛片| 日韩免费a级毛片无码a∨| 成人亚欧免费视频| 麻豆精品天美| 国产又猛又粗又爽又黄| 福利风月五月天影院| 欧美 亚洲精品首页| 美女被艹尤物视频| 少妇蹲下买菜露大唇0| 色噜噜精品一区二区三| 亚洲污污网站| www.yeyecao| 久久九色| 91爽啪| 日本色日夜干| 狼天天狼天天大香蕉| 加勒比综合88| 日韩三四五区| 黄片视频观看| 蜜臀亚洲中文| 成全在线观看免费观看| 色色色色色色色色综合| 日韩色欲久久一二三四区| 艳尻美人妻| 欧美人与性动交a美精品| 免费成人在线熟妇网| 国产精品亚洲无码| 天天激色| 日韩婷婷| 免费观看一区| 亚洲精品欧洲精品| 亚洲国产奇米影视久久| 精品国产综合久久福利,热99这里有精品综合久久,99热这里只有免费国产精品,精 | 91丨国产丨白浆秘 洗澡动漫| 91久热这里只有精品| 草草草视频在线免费看| 一级黄碟在线观看| 国产精品一二三在线看| 97超碰影音| 天天日天天爽| 伊人热综合| 91欧美综合在线| av资源在线观看少妇| 国产精品乱码久久久| 九九九久千久久激情蜜桃在线看 | 欧美熟妇成人一区二区| 伦理弟一页| 国产精品午夜高潮呻吟久久av| 欧美性爱一区二区三区| 黄色成品网站| 亚洲蜜桃V妇女| 国产传媒日韩| 最新欧美色网| 黄色大片免费在线| 91久久久久久久久久久| 成人小说另类在线| 强奸国产在线| 亚洲色图a| 亚洲综合中文字幕有码| 青娱乐91| 欧美78| 久久99久久99久久99人受| 精品v1区| 亚洲无码国产探花在线观看| 思思视频免费看网站| 日韩中文字幕2020| 五月丁香六月婷| 午夜超爽| 亚洲天天综合| 超碰97人人乐| 第45页一区二区| 手机看av网站在线看| 人人操,人人液| 久久久久婷婷精品av电影| 中日无幕一二三四区| 国产成人www免费人成看片| 9久精品| 色偷偷综合91久久噜噜| 亚洲狼狼干综合1| 99精品久久| 精品国产人成在线| 成人一二| 日日爱99| AV女资源| 99国内熟女露脸视频| 亚洲国产精品久久久久婷婷青年| 青青草天天亲夜夜操网| 日日噜噜夜夜狠狠视频无| 日天天九九天堂666| 麻豆一区在线| 性欧美| 亚洲日韩精品久久久久一区壹牛 | 波多野42部无码喷潮在线观看| 极品色综合| 91日日夜夜| 色偷偷色偷偷欧美日韩| 人妻日日夜夜精品| 一本道综合色图| 久久久久久精品免费看A级| 秋霞操逼片| 少妇久久久久久久| 1024精品在线| 色97欧美| 一区e区三| 性九九九九九九| 伊人久久久日韩一区| 亚州成人A√| 91女网站| 成 人 影视 一区 二区 三区 四区| 丁香九月激情| 国产67194| 日韩999| 91干熟女| 97最新在线播放视频| 国产激情在线| 亚洲色婷婷综合久久久久中文| 男人的天堂一区三区| 国产97在线 | 亚洲| 国产精品97视频| 清纯唯美综合| 天天干18禁| 丰满人妻一区二区三区免费 | 另类亚洲图色| 开心六月色| 天天天天天天天天综合| 亚热日本熟女| 少妇人妻激情四射| 久久精品一区一起草| 黑人精品欧美一区二区蜜桃| 淫纸中9区| 亚洲 欧美综合| 欧美超碰97| 精品人妻一区二区三区四区石在线| 欧美激情激情xxxx欧美专区| 国产黄色视频久久| 国产精品视频麻豆入口| 激情小说成人日本无码一| 人妻熟女av国产网站| 996热| 蜜臀久久久久久999| 哈哈操电影AV| 嗯嗯啊啊好大好爽| 在线播放欧洲免费av| 婷婷午夜清品久久久久久久性色视频观| 999999精品| 午夜人人操| 亚洲九月丁香| 97超碰美国| 青青操在线亚洲视频观看欧美在线 | 亚洲一区二区精品福利| www.夜夜操| 亚洲丝袜诱惑| 亚洲精品国产日韩无码AV永久免| 东北丰满熟女国产一区| 91一起操| 九九热视频这里只有精品| 欧美体内射精| 懂色Av| av无码精品久久久久| 丁香五月天啪啪| 欧美狠狠弄| 97在线观看视频| 五月丁香黄色网| 国产97视频免费观看| 91美女丝袜诱惑视频| 天天摸夜夜操视频| 东北熟女91| AAAAAAAAA黄片| 成人贴图日韩欧美| 精品乱码在线观看| 草草电影院| 日韩成人大片在线观看| 97久久精品国产| 91 天天综合| 亚州一区二区成人片免费| 亚洲色吧网| 久久久精品一区二区| 在线免费观看高清无码视频| 99久久精品国产高潮| a男人的天堂| 视频二区美腿制服人妻欧美| 99国产精品视频尤物| 狠狠中文字幕| 精品十八在线观看| 欧美另类精品xxxx| 毛片17S| 国产路线专区| 国产精品熟女丝袜一区二区| 97 国产一区| 东北毛片| 天天射影院| 日韩欧美久久婷婷网站| 岛国视频一二三区| 久极品在线观看| 欧美97在线欧| 五月天精品| 国产精品第一页国产大屁股视频免费区i| 97无码视频在线播放| 日韩三级一区 | 国产盗摄美女如厕大神作品在线观看| 少妇蹲下露出大唇5| 中国探花熟女| 无码九九| 色爱三区| 色婷婷A V一二三四区麻豆综合| 嫩草美女久久| 久久精品老司| 777AV电影| 97久久久精品| 韩三级a视频在线观看| 亚洲综合888| 亚洲啪啪综合?v一区综合精品区| 人妻啊啊人妻啊| 99re99| 久久香蕉国产传媒一区剧情天美| 久久久婷婷| 久久久久久久久久久久色网| 亚洲操人| 丰满人妻一区二区三区免费| 女优视频第10页| 久久久久久久| av优播| 日韩欧美大片免费高清啪啪| 欧美精品丝袜久久久中文字幕| 日本在线观看网址| 欧美五区| 中国少妇XXXX做受| 欧亚日韩综合精品国产| 色综合久久88色综合久久天天| 亚洲性感丝袜诱惑在线观看| 国语国产操逼伊人AV网| 精品久久艹| 色爱综合网| 欧美资源| 91亚州欧美| 色综合天天| 精品久久久一本一道| 免费观看的av| 久久久久久久强迫| 884t在线| 日韩不卡毛片Av免费高清| 久9爱精品| 天天看天天综合成人网| 无码直播久久久| 夜夜免费视频| 婷婷成人五月天| a亚洲欧美色欲| 91久久国外网| 婷婷久久久| 午夜啪| 五月天亚洲网| 中文字幕五区| 18禁免费视频| 校园春色 亚洲| 亚洲 中文 女同| av无码精品久久久久| 人妻熟女一区二区在线视频| 中文字幕在线观看AV| 一级特级aaaa毛片免费观看| 精品国产Av无码久久久亚洲| 久久久久一本一区二区青青蜜月| 国产自啪精品视频网站黑丝| 色色色综合| 一区操逼| 色亚洲欧美| 操b网站亚洲无码| 一线黄色免费性爱片| AA特级绝黄| 日日干夜夜干| 人人操人人摸avav| 九九久精品| 青青草亚洲一区| 亚欧高清v| 人妻一区二区三区视频| 亚洲黄色电影| 亚州男人的天堂| 国产剧情一区在线观看| 嗯啊抽插大香蕉网页| 啊啊啊啊操死我| 超碰一区二区| 色大香蕉97N| 人妻少妇蜜桃视频欧美一区| 很很热性爱视频| 三级精品三级在线观看| 美女t无毒不卡不卡| 伊人久久久日韩一区| 欧美日韩性感| 亚洲精品久久一区二区三区蜜桃臀| 操九九九九九九| 2018色综合天天操| 丝袜剧情| 都市久久精品激情亚洲| 亚洲综合在线第一页| 欧洲站一级二级三级h| 伊人久久大香线综合无码| 亚州伊人色综台| 欧美综合区| 欧美日韩不卡a片| 在线观看亚洲成人精品| 啊啊啊啊操死我| 日韩人妻无码不卡网站| 五月天人妻综合| av线电影| 青青草字幕AV| 亚洲男人的天堂AV| 欧美亚男人的天堂| 日产国产精品中文久久婷婷| 99热9| 97天堂| 日本肉体xxxx裸交| 蜜臀操逼黄色视频操的好爽| 欧美日本国产日韩激情视频| 一区不卡在线观看av| 翔田千里爆乳巨臀无码| 免费AV中文网在线观看| 国产熟妇 码视频户外直播| 91综合网在线| 97亚洲色图| 亚洲熟女人妻中文字幕一区二区| 精品二区久久| 久久久三区二区一区| 伊人嫩草| 亚州,欧美在线| 亚州Av天美传媒| 精品白丝一区| 骚货操死你| 夜夜欧美| 97 色综合| 一级片视频啪啪| 中英熟女操女| 无码 黑人一区二区三区| 国产无码高清操逼视频| 欧美一级久久久丰满| 日韩免费大片一级播放| 欧美不卡二区| 久久久久久AⅤ无码免费肉站| 麻豆国产免费影片| 丁香六月激情综合| 欧美综合站| 亚洲日韩av一区二区三区百合| 欧美激情视频一区二区三区不卡| 欧美国产视频| 另类成人首页一区| 变态另类专区| 亚州色综合| 亚洲在线网站| 国产理论视频在线播放| 久久9视频| 日本久操视频| 精品一区二区三区四区外站| 久久久九九| 日本加勒比无码专区| 亚洲精品一区二区日本| 777AV电影| 色五月首页| 成人影 天天操 亚洲| 99re99视频在线免费观看| 五月天欧美色图| 久久高潮妇女视频| 国内精品a| 亚欧Av| 97精品一二区| 精品少妇人妻| av中亚| 2018天天干在线视频| 人人扣人人操| 中文字幕片| 91超碰丝袜制服| 国产精品人妻无码久久久老鸭窝 | 屁股久久久久久久久| 玖玖爱视频网站| 999久久久免费精品国产牛牛| 国产熟女完整版中字| 二色av| 亚洲色图国产另类| 熟妇人妻精品一区二区| 国产精品不卡一区二区三区av| 91成人久久| 一本正道久久熟女| 国产精品久久久久久片| 成人 日韩欧美一区| 超碰碰激情97+久| 日本欧美不卡| 亚洲五码一区二区三区| 亚洲色图激情小说| 蜜桃丰满熟妇av无码区不卡| 欧美第一页| 亚洲成人久久美女| 亚洲综合99999| 99re黄| 成人aⅴ一区二区三区| 校园春色 男人天堂| 大香蕉92| 人妻献身系列第54部| 黑丝少妇在线观看| 蜜臀无码一区二区| 肏逼视频日本| 精品区9| 97 国产精品| 久干9操| 日日天天久久啊啊aaa| 0755午夜福利视频| www.91逼逼.com| 综合网久久| 老熟女91视频| 最新日韩黄片| 97超色| 久久国产免费激情视频| 射丝袜高跟鞋99| 深夜国产福利| 六月丁香啪啪啪| 伊人在线大香蕉视频久久| 亚洲国产精品9999在线观看| 91丝袜美女| 男人天堂2017| 五月天开心网| 91观看 国产白丝| 免费a在线播放v| 91欧美丝袜| 欧美强奸乱能| 国产乱码精品久久久久久| 黄色香蕉视频网站一区| 在线观看AV不卡| 亚洲欧美另类小说| a久久| 欧美性夜| 六月天婷婷| 美女性91| 天天操夜夜操| 久久久久久久9| 污啪啪啪视频| 亚洲AV无码乱码| 欧美|91色综合| 大香蕉综合网| 操穴国产| 久久精品国产欧美日韩亚洲欧美日韩中文久久国产一区 | 亚洲第91页| 亚洲图片色图欧美另类| 国精综合一二三区影视| 日韩激情毛片一级久久久| 欧美中文字幕一区| 操操操五月天婷婷丁香影院| 日韩99神马视频播放| 久久久精品电影| 欧美中字二区| 国产宅男宅女在线观看| 日韩色女精品| a级理论午夜日本| 91色欧美| 久久黄黄| 欧美亚洲国产91在线| 中出789在线视频| 国产精品无套内谢| 五月天欧美色图| 久99视频| 91精品国产91综合久久蜜臀| 色鬼在线综合| 国产亚洲精品美女久久久久久2021| 欧美色日| 伊人婷婷五月天| 亚洲性爱高潮影院| a级免费在线观看| 亚洲欧洲久久天堂| 国产又大又粗又长视频在线| 中国人高清www色视频免费| 久热这里| 久久精品国产亚洲粉嫩| 婷婷五月天av| 夜夜久久久| 九九热AV| 天天欧美| 久久久久免费少妇| 美女久久久久久久久久久| 丁香婷婷色五月| 日韩精品午夜操呦呦不卡影院| 亚洲经典啪啪| 日本布卡一区二三区| www超碰| 色香欲综合| 精品久久久久久亚洲| 999综合网| 天天看片天天爽| 国模无码人体一区二区三| 国产精品久久久久久夜夜夜| 97欧美日韩综合| 欧美97av| 日本亚洲vr欧美不卡高清专区| 97精品一区二区视频在线观看| 五月天婷精品激情| 色九色久| 色五月网址| 国产色产精品在线观看| 亚洲欧美九九九| 欧美一区二区三区入口| 九九九九九精品十六| 亚洲精品人妻吞精av| 九九九偷拍| 白嫩嫩一区| 成年人网站在线免费观看| 神马午夜久久久| 黄色网址在线免费观看| 国产美女91| 国产少妇与亚洲av| 日日操免费视频| 蜜臀无码一区二区| 啊啊啊不要好疼视频| 97爱| 自拍亚洲综合| 久久xx| 韩三级a视频在线观看| 龙兴卡官方查询| 丁香五月激情综合| 国产黄色在线播放观看| 一级免费精品| 黄页18禁| 一区二区三区四区免费视频| 在线天堂资源亚洲| 中文字幕片| 91呆哥人妻| 日本国产欧美一区三区二区| 国产第二页| 天堂蜜桃无码视频一区二区| 狠狠操官网| 久久蜜桃一区二区| 99抽插| 欧美日韩91| 欧亚性爱在线视频| 友优传媒精品在线一区二区| 天天综合香 ld视频| 五月婷婷激情网| 色综合V| 欧美天天综合在线| 91黑丝美女| 亚洲有码 视频一区| 无码av永久免费专区网站| 狠狠91| 亚洲美腿丝袜香蕉影视欧美成人| 日韩伦理视频| 国产超碰| 色欲av一区二区三区蜜芽| 伊人麻豆传媒| 99久久9| 日韩钢筋无码高清啾啾啾| 激情综合五月| 午夜欧美女人操逼| 色欲av一区二区三区蜜芽| 亚洲熟妇A V黑人| 久久久91福利姬| 久插不卡| 国产精品经典一卡久久久| 99久久综合网| 国产精品探花视频| 免费成人在线观看91| 久久日本熟妇熟色一区| 骚妻少妇精品性色无码四色A V| 久草色悠悠在线视频| 97久精品| 九九99久久| 岛国精品视频在线观看| 国产亚洲女v在线观看| 日欧操屄| 天天综合亚洲综合| 少妇高潮九九九九| 91高清欧美| 黑人粗大V S日韩女优视频| 亚州春色| 玖玖蜜臀资源网| 久久25| 九九久久久九九| 国产日本熟女顶级一区二区三区视频 | 天天看天天日天天操| 成人小电影网站tex| 深夜激情 | 亚洲18禁| 大香蕉123| 日日狠狠久久偷偷色综合免费| 欧美日韩999| 色综合久| 天天弄天天操| 国产丝袜视频| 激情自拍 校园春色| 人妻AV 中文字幕的| 骚逼高潮久久精品| 激情自拍 校园春色| 亚洲精品一区中文字幕乱码| 丝袜美腿诱惑亚洲欧美视频在线观看| 4399成人黄A片| 五月婷丁香| 鲁鲁色综合网| 久热久一区二区三区| 一区二区三区四区五区高清无码永久视频 | 国产亚洲精品美女久久久m| 最新中文字幕精品在线| 最新啪啪视频| 一起草av| 久久女人视频|