我是Java新手,在google和stackoverflow中搜索了这个问题,找到了一些帖子,但仍然无法理解。
我想使用 Java 中的 DLL 库 (C++) 方法。我使用 JNA 来达到这个目的。 JNA 找到了我的库,但找不到我的方法:Exception in thread "main" java.lang.UnsatisfiedLinkError: Error looking up function 'LoadCurrentData': The specified procedure could not be found.
My code:
package javaapplication1;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
import com.sun.jna.Pointer;
public class JavaApplication1 {
public interface LibPro extends Library {
LibPro INSTANCE = (LibPro) Native.loadLibrary(
(Platform.isWindows() ? "LibPro" : "LibProLinuxPort"), LibPro.class);
public short LoadCurrentData();
}
public static void main(String[] args) {
LibPro sdll = LibPro.INSTANCE;
sdll.LoadCurrentData(); // call of void function
}
}
我使用 Dependency Walker Tool 查看了我的 DLL,发现我的函数名称有前缀和后缀 - 它看起来像_LoadCurrentData@0
感谢您的回复!
附:我找到了有效的好例子http://tutortutor.ca/cgi-bin/makepage.cgi?/articles/rjna http://tutortutor.ca/cgi-bin/makepage.cgi?/articles/rjna(清单 6)。
我想说你需要应用正确的名称映射器,因为你注意到函数名称被破坏了,你需要注册CallMapper
这将实现与编译器相同的修改。
这是一个相关条目来自JNA主页 https://github.com/twall/jna/blob/master/www/FrequentlyAskedQuestions.md#my-library-mapping-causes-an-unsatisfiedlinkerror:
使用转储实用程序检查导出函数的名称以确保它们匹配(Linux 上为 nm,取决于 Windows)。在 Windows 上,如果函数具有“@NN”形式的后缀,则在初始化库接口时需要传递 StdCallFunctionMapper 作为选项。通常,您可以使用函数映射器 (FunctionMapper) 来更改查找方法的名称,或者使用调用映射器 (InvocableMapper) 对方法调用进行更广泛的控制。
这是一个可能相关的问题:使用 StdCallFunctionMapper 重命名 JNA 中的 DLL 函数 https://stackoverflow.com/questions/518131/renaming-dll-functions-in-jna-using-stdcallfunctionmapper
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)