You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java 19 Project Panama无法找到GetCurrentDirectory函数求助

问题解答

是的,必须明确指定GetCurrentDirectory所在的kernel32.dll才能找到这个函数,原因和你测试的printf不一样:

  • printf属于C标准库(Windows上对应msvcrt.dll或ucrtbase.dll),Panama的linker.defaultLookup()会自动关联系统标准C库,所以不用额外加载就能找到符号。
  • 而GetCurrentDirectory是Windows API函数,属于kernel32.dll,这个库不在Panama默认的查找范围内,必须显式加载后才能查找对应的函数符号。

修正后的代码示例:

final Linker linker = Linker.nativeLinker();
// 显式加载Windows系统核心库kernel32.dll
final SymbolLookup kernel32Lookup = SymbolLookup.loadLibrary("kernel32");
final SymbolLookup linkerLookup = linker.defaultLookup();
final SymbolLookup systemLookup = SymbolLookup.loaderLookup();

// 调整符号查找顺序:优先从kernel32查找,再查其他来源
final SymbolLookup symbolLookup = name -> kernel32Lookup.lookup(name)
                                 .or(() -> systemLookup.lookup(name))
                                 .or(() -> linkerLookup.lookup(name));

// 注意:Windows API推荐使用宽字符版本(后缀W),避免编码问题
final MemorySegment addr = symbolLookup.lookup("GetCurrentDirectoryW")
                          .orElseThrow(() -> new IllegalStateException("无法找到GetCurrentDirectoryW函数"));

额外提示:调用GetCurrentDirectoryW时,需要传入足够大小的宽字符缓冲区(用MemorySegment分配),并按照函数的签名(DWORD GetCurrentDirectoryW(DWORD nBufferLength, LPWSTR lpBuffer))来绑定调用接口。

内容的提问来源于stack exchange,提问作者Thomas S.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 06:12:11