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

System.loadLibrary
System.loadLibrary 参数为库文件名,不包含库文件的扩展名。

System.loadLibrary ("TestJNI"); //加载Windows下的TestJNI.dll本地库

System.loadLibrary ("TestJNI"); //加载Linux下的libTestJNI.so本地库

注意:TestJNI.dll 或 libTestJNI.so 必须是在JVM属性java.library.path所指向的路径中。

本地库的依赖库

如果你要载入的库文件静态链接到其它动态链接库,如TestJNI.dll 静态链接到dependency.dll,必须注意:
1)如果你选择System.load("D:\\lib\\TestJNI.dll");
那么即使你把dependency.dll同样放在D:\\lib下,load还是会因为找不到依赖的dll而失败。

因为jvm在载入TestJNI.dll会先去载入TestJNI.dll所依赖的库文件dependency.dll,而dependency.dll并不位于java.library.path所指定的目录下,所以jvm找不到dependency.dll。
你有两个方法解决这个问题:

一是把D:\\lib加入到java.library.path的路径中。

二是先调用System.load("D:\\lib\\dependency.dll"); 让jvm先载入dependency.dll,

然后再调用System.load("D:\\lib\\TestJNI.dll");

2)如果你选择System. loadLibrary ("TestJNI");
那么你只要把dependency.dll放在任何java.library.path包含的路径中即可。

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

System.load 与 System.loadLibrary 的区别的相关文章

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) 参数为dl

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

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

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

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.

system sys,sysoper sysdba 的区别

--===================================== -- system sys,sysoper sysdba 的区别 --===================================== Oracle 中sys,system帐户以及登陆时的normal,sysoper,sysdba是经常容易混淆的几个概念,下面详细讲述了 这几个的区别. 一.sys,system帐户 当Oracle 数据库安装完毕后,系统会自动创建两个帐户如下: sys     :缺省密码为

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

System.nanoTime与System.currentTimeMillis的区别

平时产生随机数时我们经常拿时间做种子,比如用 System.currentTimeMillis的结果,但是在执行一些循环中使用了System.currentTimeMillis,那么每次的结 果将会差别很小,甚至一样,因为现代的计算机运行速度很快.后来看到java中产生随机数函数以及线程池中的一些函数使用的都是 System.nanoTime,下面说一下这2个方法的具体区别. System.nanoTime提供相对精确的计时,但是不能用他来计算当前日期,在jdk中的说明如下: 返回最准确的可用系

解决: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