`
azrael6619
  • 浏览: 579658 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

System.load 和 System.loadLibrary详解--同时可以解决未加载dll错误

阅读更多
System.load 和 System.loadLibrary详解

1.它们都可以用来装载库文件,不论是JNI库文件还是非JNI库文件。在任何本地方法被调用之前必须先用这个两个方法之一把相应的JNI库文件装载。

2.System.load 参数为库文件的绝对路径,可以是任意路径。
例如你可以这样载入一个windows平台下JNI库文件:
System.load("C:\\Documents and Settings\\TestJNI.dll");。

3. System.loadLibrary 参数为库文件名,不包含库文件的扩展名。
例如你可以这样载入一个windows平台下JNI库文件
System. loadLibrary ("TestJNI");

这里,TestJNI.dll 必须是在java.library.path这一jvm变量所指向的路径中。
可以通过如下方法来获得该变量的值:
System.getProperty("java.library.path");
默认情况下,在Windows平台下,该值包含如下位置:
1)和jre相关的一些目录
2)程序当前目录
3)Windows目录
4)系统目录(system32)
5)系统环境变量path指定目录

4.如果你要载入的库文件静态链接到其它动态链接库,例如TestJNI.dll 静态链接到dependency.dll, 那么你必须注意:
1)如果你选择
System.load("C:\\Documents and Settings\\ TestJNI.dll");
那么即使你把dependency.dll同样放在C:\\Documents and Settings\\下,load还是会因为找不到依赖的dll而失败。因为jvm在载入TestJNI.dll会先去载入TestJNI.dll所依赖的库文件dependency.dll,而dependency.dll并不位于java.library.path所指定的目录下,所以jvm找不到dependency.dll。
你有两个方法解决这个问题:一是把C:\\Documents and Settings\\加入到java.library.path的路径中,例如加入到系统的path中。二是先调用
System.load("C:\\Documents and Settings\\ dependency.dll"); 让jvm先载入dependency.dll,然后再调用System.load("C:\\Documents and Settings\\ TestJNI.dll");
2)如果你选择
System. loadLibrary ("TestJNI");
那么你只要把dependency.dll放在任何java.library.path包含的路径中即可,当然也包括和TestJNI.dll相同的目录。

分享到:
评论

相关推荐

    深入解析System.load 与 System.loadLibrary

    Java中的`System.load`和`System.loadLibrary`都是用于加载本地库(Native Library)的方法,主要服务于Java本地接口(Java Native Interface, JNI),允许Java代码调用C/C++编写的函数。这两个方法在处理库文件时有...

    libwinpthread-1.dll.rar

    标题中的"libwinpthread-1.dll.rar"是一个RAR压缩文件,包含Windows系统下的动态链接库(DLL)文件“libwinpthread-1.dll”。这个文件在描述中被提及是与安装CMake过程相关的,通常,DLL文件是Windows操作系统中用于...

    api-ms-win-core-libraryloader-l1-2-0.dll

    在Windows操作系统中,动态链接库(DLL)扮演着至关重要的角色,它们提供了代码和资源的共享,使得多个程序可以同时使用同一功能,节省系统资源。"api-ms-win-core-libraryloader-l1-2-0.dll"便是这样一个关键组件,...

    python 调用 C++ dll 32位 64位 问题 ctypes.cdll.LoadLibrary

    t532.rar 测试代码 https://blog.csdn.net/wowocpp/article/details/105382257 python 调用 C++ dll 32位 64位 问题 ctypes.cdll.LoadLibrary

    jacob-1.18-x64.dll下载

    1. 加载DLL:使用`System.loadLibrary("jacob-1.18-x64")`加载DLL。 2. 创建`com.jacob.activeX.ActiveXComponent`实例,表示与Word的连接。 3. 调用Word对象的相关方法,如打开文档、编辑内容、保存文档等。 例如...

    C#中加载和卸载DLL

    在C++中,通过`LoadLibrary`和`FreeLibrary`函数可以轻松地加载和卸载DLL。而在C#中,虽然可以通过`Assembly.LoadFile`方法来动态加载DLL,但是在卸载DLL方面却没有直接对应的方法,这是因为C#采用了垃圾回收机制。 ...

    直接加载并调用DLL中函数

    xDll工程只是一个测试用的dll,附上代码,编译出的xDll.dll直接放在testLoadDll工程目录下 testLoadDll是实际测试代码,从资源直接加载Dll并调用其导出函数 加载用MemoryLoadLibrary() 查找导出函数用...

    api-ms-win-core-libraryloader-l1-2-0.dll文件

    api-ms-win-core-libraryloader-l1-2-0.dll文件是Windows操作系统的核心动态链接库之一,它提供了与加载和卸载动态链接库(DLL)相关的函数和功能。 该DLL文件包含了一些与库加载和管理相关的函数,例如LoadLibrary...

    C#中动态加载和卸载DLL

    obj.LoadAssembly(@"TestDLL.dll"); // 调用DLL中的方法 obj.Invoke("TestDll.Class1", "Test", "It's a test"); // 卸载AppDomain,同时卸载DLL AppDomain.Unload(ad); // 释放对ProxyObject的引用 obj =...

    android安卓源码解析-Sytem.loadLibrary.pdf

    在Android开发中,加载本地共享库.so文件是一个常见的操作,通常涉及到System类中的两个方法:System.loadLibrary()和System.load()。这两个方法都用于加载native代码库,但它们的用法和工作原理存在一些差异。以下...

    关于海康威视HCNetSDK.dll的调用

    海康威视HCNetSDK.dll是海康威视公司为开发者提供的一款用于集成其设备和服务的动态链接库,主要用于视频监控、录像回放等安防领域的功能实现。在Java环境中,由于Java本身不支持直接调用C/C++编写的DLL文件,我们...

    内存加载dll-内存加载dll.rar

    内存加载DLL(Dynamic Link Library)是一种在Windows操作系统中常见的技术,用于在程序运行时动态地加载和使用库函数。DLL文件本质上是可执行代码和数据的集合,它们可以在多个进程之间共享,从而节省系统资源并...

    从指定文件byte[]内存数组加载非托管DLL API

    但C++ kernel32.dll LoadLibrary只能加载指定路径非托管DLL..有了kernel.dll现在好了.可以像C#一样轻松从内存或资源里加载非托管DLL.. 从指定文件byte[]内存数组加载非托管DLL API 此DLL接口 FARPROC ...

    version.dll 劫持源代码

    同时,对于安全研究人员,学习`version.dll`劫持的源码分析和逆向工程,可以帮助找出防御策略。 ### 5. 防御措施 - **文件完整性检查**:定期检查系统文件的哈希值,确保没有被篡改。 - **安全软件**:安装并更新...

    zebra连接打印机dll包

    在这个场景下,`ZebraNativeUsbAdapter_64.dll`和`ZebraNativeUsbAdapter_32.dll`是64位和32位的驱动程序,分别用于64位和32位的操作系统,它们实现了与斑马打印机USB接口的通讯功能。 要使用这些dll文件,你需要在...

    ControlCAN.dll

    在VC++或C环境中,开发者可以通过声明函数原型来使用这些API,然后通过`LoadLibrary`和`GetProcAddress`函数动态加载和调用ControlCAN.dll中的功能。这允许程序在运行时查找和使用所需的功能,而不是在编译时硬编码...

    MingW VC 之.a .lib .dll .def 关系

    MingW VC 之.a .lib .dll .def 关系主要涉及的是在Windows环境下,使用Microsoft Visual C++ (MSVC) 和 MinGW 工具链编译C或C++程序时,不同类型的文件及其相互关系。这里主要讲解的是库文件、动态链接库(DLL)、导...

    WINDOWS程序员使用指南(一)----DLL和内存管理

    1. **DLL的加载与导出函数**:当应用程序需要使用DLL时,会通过LoadLibrary或GetProcAddress函数来加载DLL并获取其导出函数的地址。DLL通过定义导出函数和数据来提供服务,这些导出信息在编译DLL时通过.def文件或...

    Windows环境下Java加载DLL.docx

    System.load("C:\\chilkatJava\\chilkat.dll"); } catch (UnsatisfiedLinkError e) { System.err.println("Native code library failed to load.\n" + e); System.exit(1); } } public static void main...

Global site tag (gtag.js) - Google Analytics