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.
相关产品推荐
相关产品推荐

