深入解析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相同的目录。

(0)

相关推荐

  • 深入解析System.load 与 System.loadLibrary

    1.它们都可以用来装载库文件,不论是JNI库文件还是非JNI库文件.在任何本地方法被调用之前必须先用这个两个方法之一把相应的JNI库文件装载. 2.System.load 参数为库文件的绝对路径,可以是任意路径.例如你可以这样载入一个windows平台下JNI库文件:System.load("C://Documents and Settings//TestJNI.dll");. 3. System.loadLibrary 参数为库文件名,不包含库文件的扩展名.例如你可以这样载入一个wi

  • Could not load type System.ServiceModel.Activation.HttpModule解决办法

    Could not load type 'System.ServiceModel.Activation.HttpModule' from assembly 'System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.] 上网搜了下,问题产生的原因是在安装了IIS后又装了其他版本的framework, 导致assemble中的版本和程序使用的版本不一致了.解决办法是使用 aspne

  • java基础(System.err和System.out)详解

    今天有位同事在使用System.err和System.out遇上了一些小问题. 看了些资料总结下: 1.JDK文档对两者的解释: out:"标准"输出流.此流已打开并准备接受输出数据.通常,此流对应于显示器输出或者由主机环境或用户指定的另一个输出目标. err:"标准"错误输出流.此流已打开并准备接受输出数据.通常,此流对应于显示器输出或者由主机环境或用户指定的另一个输出目标.按照惯例,此输出流用于显示错误消息,或者显示那些即使用户输出流(变量 out 的值)已经重

  • 浅谈System.getenv()和System.getProperty()的区别

    最近遇到一个需求,服务器实例需要获取当前的环境变量.经过查资料,发现环境变量可以在两个地方设置. 一.在系统层面设置环境变量 在系统层面设置环境变量,之前我们应该都操作过,以windows系统为例 System.getenv()可以获取的在这里设置的变量. 二.在java虚拟机层面设置环境变量 个人理解,System.getProperty()可以获取在JVM 层面的变量,有些变量在JVM启动后,就内置了,如: 参数值 参数含义 java.version Java 运行时环境版本 java.ve

  • 解决java调用dll报Unable to load library错误的问题

    如下: 1.确保路径下有该dll文件 2.dll和jdk必须确保同样是64位或者32位. 3.地址url中不能出现"/",必须是"\". 4.路径一定要对. 5.如果有同样的文件名出现,要在路径后面加上 ".dll",比如:System.getProperty("user.dir")+"\library"+"\PlayCtrl.dll" 补充知识:Java语言调用第三方dll文件的使用方

  • Java + Selenium + OpenCV解决自动化测试中的滑块验证问题

    目录 1.滑块验证思路 2.使用OpenCV进行图片解析 2.1 OpenCV引入项目 2.2 实现图片解析,计算所需距离 2.3 算法解析说明 3.Selenium处理滑块滑动 4.最终效果 最近工作过程中,一个常用的被测网站突然增加了滑块验证环节,导致整个自动化项目失效了. 为了解决这个滑块验证问题,在网上查阅了一些资料后,总结并实现了解决方案,现记录如下. 1.滑块验证思路 被测对象的滑块对象长这个样子.相对而言是比较简单的一种形式,需要将左侧的拼图通过下方的滑块进行拖动,嵌入到右侧空槽中

  • OpenCV Java实现人脸识别和裁剪功能

    本文实例为大家分享了OpenCV Java实现人脸识别和裁剪的具体代码,供大家参考,具体内容如下 安装及配置 1.首先安装OpenCV,地址 这里我下载的是Windows版的3.4.5 然后安装即可-- 2.Eclipse配置OpenCV Window->Preferences->Java->User Libraries New输入你的Libraries名 这里我的安装目录是D:\OpenCV,所以是: 然后引入dll,我是64位机子,所以是: Ok,下面创建Java项目做Java与Op

  • Java通过JNI 调用动态链接库DLL操作

    JNI(Java Native Interface)Java本地接口,主要作用是实现java代码与C.C++编写的代码交互. 在Android编程中,so库的访问也用到了jni技术. 理论多说无益,还是看java连接dll的实战吧.如下: 例:java中调用demo.dll文件中的 hello()方法. 1.java 1)装载dll文件 有两种方式System.load();和System.loadLibrary(); load需要全路径且需要有文件扩展名: loadLibrary是特定路径,系

  • 查找native方法的本地实现函数native_function详解

    在之前介绍为native方法设置解释执行的入口时讲到过Method实例的内存布局,如下: 对于第1个slot来说,如果是native方法,其对应的本地函数的实现会放到Method实例的native_function这个slot中,将本地函数放到这个slot就是registerNative()函数要完成的. 在前面介绍为native方法生成解释执行入口时介绍过,当判断出Method::native_function还没有值时,会调用InterpreterRuntime::prepare_nativ

  • C#命令行参数解析库System.CommandLine使用

    命令行参数 平常在日常的开发过程中,会经常用到命令行工具.如cmd下的各种命令. 以下为sc命令执行后的截图,可以看到,由于没有输入任何附带参数,所以程序并未执行任何操作,只是输出了描述和用法. 系统在创建一个新进程时,会传一个命令行给它,也就是命令行字符串. 程序需要对命令行字符串进行解析,并执行相应操作. 如使用sc query可以查询当前系统的服务: 在C#中的控制台程序中,Main函数中传入的args字符串数组,就是系统传入进程的命令行参数. 在构建具有复杂命令行参数的控制台程序时 ,手

随机推荐