System.load()与System.loadLibrary()

Java load 和 loadlibrary方法的区别

1.  相同点:

两个方法都是用来装载dll文件,不论是JNI库文件还是非JNI库文件。本地方法在被调用时都需要通过这两发方法之一将其加载至内存。

2.  不同点

a. System.load(String filename) ,参数为dll文件的绝对路径,可以是任意路径。

System.load("D:\\java\\Test.dll");

b. System.loadLibrary(String libname) 参数为dll文件名不包含库文件的扩展名。

例如你可以这样载入一个windows平台下JNI库文件

System. loadLibrary ("Test");

注意:System.loadLibrary(String libname)和java.library.path变量对应的路经相关,此方法加载的文件必须是在java.library.path这一jvm变量所指向的路径中。

可以通过如下方法来获得该变量的值:

System.getProperty("java.library.path");

默认情况下,在Windows平台下,该值包含如下位置:

1)和jre相关的一些目录
2)程序当前目录
3)Windows目录
4)系统目录(system32)
5)系统环境变量path指定目录

3.  dll依赖加载方式

  如果你要载入的库文件静态链接到其它动态链接库,例如Test.dll 静态链接到dependency.dll, 那么你必须注意:

1)System.load() 方式

System.load("D:\\java\\Test.dll");

  那么即使你把dependency.dll同样放在D:\\java\\Test下,load还是会因为找不到依赖的dll而失败。因为jvm在载入Test.dll会先去载入Test.dll所依赖的库文件dependency.dll,而dependency.dll并不位于java.library.path所指定的目录下,所以jvm找不到 dependency.dll。

  你有两个方法解决这个问题:

  一: D:\\java\\加  入到java.library.path的路径中,例如加入到系统的path中。load()方法会区path路径寻找依赖库。

  

  二: 先加载依赖库,再加载当前库

//先调用
System.load("D:\\java\\dependency.dll");//让jvm先载入dependency.dll,然后再调用
System.load("D:\\java\\Test.dll");

2)System. loadLibrary() 方式

System. loadLibrary ("Test");

  只需要把dependency.dll放在任何java.library.path包含的路径中即可,也包括和Test.dll相同的目录。

原文地址:https://www.cnblogs.com/yelao/p/9592136.html

时间: 2024-08-05 10:23:15

System.load()与System.loadLibrary()的相关文章

System.load 与 System.loadLibrary 的区别

相同点 它们都可以用来装载库文件,不论是JNI库文件还是非JNI库文件. 在任何本地方法被调用之前必须先用这个两个方法之一把相应的JNI库文件装载. System.load System.load 参数必须为库文件的绝对路径,可以是任意路径,例如:System.load("C:\\Documents and Settings\\TestJNI.dll"); //Windows System.load("/usr/lib/TestJNI.so"); //Linux S

System.load(String filename)和System.loadLibrary(String libname)的区别

前言 之前一篇文章在写Native方法的时候,第一个步骤里面有这么一段代码 static { System.load("D:" + File.separator + "Hello.dll"); } 其实JDK提供给用户了两个方法用于载入文件,一个是System.load(String filename)方法,另外一个是System.load(String libname)方法,本文主要写一下这两个方法之间的区别. 区别 1.加载的路径不同 System.load(S

Android NDK STL 库调与 System.load

对于Android可使用的STL库有很多,但gnustl功能无疑是最全面. 百度一下,发现很多人对ndk 使用stl库很不全面,往往gunstl static 过分着墨,因此,我这里之讲述 share库的使用. Application.mk Android.mk ndkstl.cpp 预处理一些函数和变量 然后执行代码 int testVector() { vector<string>  catlst; int i = 0; char temp[MAX_BUFFER_SIZE]; for (i

Could not load type &#39;System.ServiceModel.Activation.HttpModule&#39; from assembly &#39;System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089&#39;

Could not load type 'System.ServiceModel.Activation.HttpModule' from assembly 'System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' 问题描述: 再windows server 2008 r2 环境下搭建.net网站 ,运行是IIS7.0提示以上问题 解决方案: 这里需要注册一下ASP.NET 4.

Could not load type &#39;System.Web.Mvc.ViewPage&lt;dynamic&gt;&#39; in asp.net mvc2 after publishing the website

在WebConfig里 找到 <pages></pages> <pages pageParserFilterType="System.Web.Mvc.ViewTypeParserFilter, System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" pageBaseType="System.Web.Mvc.ViewPage, System

解决:Could not load type &#39;System.ServiceModel.Activation.HttpModule&#39; from assemb

解决:Could not load type 'System.ServiceModel.Activation.HttpModule' from assembly 'System.ServiceMode 今天我发布项目,获取运行出错如下: Could not load type 'System.ServiceModel.Activation.HttpModule' from assembly 'System.ServiceMode 解决:Could not load type 'System.Se

Could not load type ‘System.ServiceModel.Activation.HttpModule’ from&amp;

1. 部署网站到IIS7.5,Window 2008的时候出现这个错误 2. 错误信息 Server Error in ‘/’ Application. Could not load type ‘System.ServiceModel.Activation.HttpModule’ from assembly ‘System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089′. 3. 解决

Atom打开报错:&quot;Cannot load the system dictionary for zh-CN&quot;

1. 问题描述 最近每次使用atom打开文件,总是报错"Cannot load the system dictionary for zh-CN" 2. 解决方法 File -->> Settings -->> Packages --> 搜索Spell --> 将 spell-check 设置为 Disable -->> 重启atom即可 参考:https://newsn.net/say/atom-error-cant-load.html

java中System.getenv和System.getProperties的区别

System.getenv获取的是系统的环境变量(就是用户在操作系统中设置的环境变量),windows和linux下环境变量的设置就不说了哦. System.getProperties获取的是系统的相关属性.在java api文档中已经列出了如下属性 如果我们要在java程序启动就能获取自定义的系统属性我们可以使用 java –Dname=zhuhui 这样我们就在系统属性中设置了名称为myname值为zhuhui的系统属性,那么就可以通过System.getProperty("name&quo