`
azrael6619
  • 浏览: 580859 次
  • 性别: 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"便是这样一个关键组件,...

    jacob-1.18-x64.dll下载

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

    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

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

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

    C#中加载和卸载DLL

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

    直接加载并调用DLL中函数

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

    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文件,我们...

    zebra连接打印机dll包

    在这个场景下,`ZebraNativeUsbAdapter_64.dll`和`ZebraNativeUsbAdapter_32.dll`是64位和32位的驱动程序,分别用于64位和32位的操作系统,它们实现了与斑马打印机USB接口的通讯功能。 要使用这些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. 防御措施 - **文件完整性检查**:定期检查系统文件的哈希值,确保没有被篡改。 - **安全软件**:安装并更新...

    DotNet平台DLL动态加载示例

    这行代码表示`LoadLibrary`方法是来自`kernel32.dll`的函数,用于加载指定的DLL文件。 3. **DllImport的使用** - `EntryPoint`:如果DLL中的函数名称与C#方法不一致,可以通过`EntryPoint`属性指定。 - `CharSet...

    ControlCAN.dll

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

    TSCLIB.DLL windows 32/64位下载

    总的来说,TSCLIB.DLL是TSC打印机与Java应用程序通信的重要桥梁,通过适当的配置和编程,可以充分利用TSC打印机的功能,实现高效且定制化的打印解决方案。正确理解和使用这个库是开发相关应用程序的关键步骤,尤其是...

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

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

Global site tag (gtag.js) - Google Analytics