• Exception in thread "main" java.lang.UnsatisfiedLinkError: Unable to load library 'dll.msvcrt'


    上网找了一下方法,说是jdk64的问题,也有说是路径不对问题。

    代码片段

    1 public interface CLibrary extends Library {
    2     CLibrary INSTANCE = (CLibrary) Native.loadLibrary("dll\msvcrt",
    3                 CLibrary.class);//第二个参数是本接口的Class类型。JNA通过这个Class类型,
    //根据指定的.dll/.so文件,动态创建接口的实例。该实例由JNA通过反射自动生成。
    4 void printf(String format, Object... args); 5 }

    在看到以下文章之后,觉得loadLibrary()加载时顺序是从当前目录下找到,没找到,这去项目根目录下找win32/win64文件夹,找到再找其中的dll文件,

    没有找到,就到windows/system32下寻找。

    其中当前目录下验证成功, windows/system32成功,去项目根目录下找win32/win64文件夹没有成功。

    这里面的知识点还是挺多的,

    首先需要确定一点,各个版本需要完全对应,msvcrt.dll  应该是32位的,然后,jdk需要也是32位,

    Native.loadLibrary("msvcrt", Clibrary.class);   意思为,动态加载msvcrt.dll文件,利用反射动态地创建CLibrary对象, 然后返回给INSTANCE, 

    这里面设计到连个问题,一个加载dll文件的路径问题,一个加载dll文件的方法问题,

    1. 加载dll文件的方法

    System.load("D:\workspace\TestDll\TestDLL.dll");//absolutePath绝对路径

    System.loadLibrary("TestDLL");  // 使用 dll的名称, 底层会根据System.getProperty("java.library.path");自动寻找  TestDLL.dll文件,

    这里System.getProperty("java.library.path")的值为通过initializePath(usr_paths = initializePath("java.library.path"))方法付给user_paths[ ]了,

    一般为

    D:	oolJavajdk1.6.0_45x86in;
    C:Windowssystem32;
    C:Windows;
    D:/tool/myeclipse/Genuitec/Common/binary/com.sun.java.jdk.win32.x86_1.6.0.013/jre/bin/client;
    D:/tool/myeclipse/Genuitec/Common/binary/com.sun.java.jdk.win32.x86_1.6.0.013/jre/bin;
    
    D:	oolJavajdk1.6.0_45in;
    D:	oolJavajdk1.6.0_45jrein;
    ;
    .

    所以这就是有些人把TestDLL.dll放到C:Windowssystem32下,系统也能够找到,放在jdk的bin文件下,和当前目录(.) , 也能找到的原因。

    Native.loadLibrary("TestDLL" , class); 底层使用的方法是System.loadLibrary("TestDLL");

    2. 加载dll文件的路径

    从前面可以看到dll放的路径, 一般是C:Windowssystem32(注意:在win10系统中,是放在windowssysWow下的); 或者是jdk的bin文件下,
    或者path 路径下, 或者整个项目名下。
     

     整个项目下,可以用使用

    System.loadLibrary("src/com/alison/jnaDemo/CreateDll");   //项目下src/com/alison/jnaDemo/CreateDll.dll可以加载
    使用\就不行了
  • 相关阅读:
    VS Code 快捷键(中英文对照版)
    Linux下SVN提交时强制写日志
    如何搞定SVN目录的cleanup问题和lock问题
    Unity3D中利用Action实现自己的消息管理(订阅/发布)类
    Unity3D热更新之LuaFramework篇[03]--prefab加载和Button事件
    Unity3D热更新之LuaFramework篇[02]--用Lua创建自己的面板
    Unity3D热更新之LuaFramework篇[01]--从零开始
    Unity UI性能优化技巧
    Unity中雾效的开启
    解决Unity中模型部件的MeshCollider不随动画一起运动的问题
  • 原文地址:https://www.cnblogs.com/alisonGavin/p/7465478.html
Copyright © 2020-2023  润新知