`
miyazaki
  • 浏览: 17928 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java中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++编写的函数。这两个方法在处理库文件时有...

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

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

    (最终解决)java.lang.UnsatisfiedLinkError解决尝试

    在Java中,我们可以通过`System.loadLibrary("libraryName")`来加载本地库。这里的"libraryName"是库文件的名称(不包含后缀),例如在Linux或Mac系统上通常是`liblibraryName.so`,在Windows系统上则是`libraryName...

    was not found on the java.library.path

    3. **使用绝对路径**:如果在代码中使用`System.loadLibrary("tcnative-1")`,可以考虑改为使用库文件的绝对路径。 4. **配置应用服务器**:对于像Tomcat这样的应用服务器,可以在其配置文件(如`catalina....

    Windows环境下Java加载DLL.docx

    需要注意的是,`java.library.path`初始化自环境变量`PATH`,其中列出的目录顺序可能与`PATH`不同,且当前目录(`.`)通常包含在`java.library.path`中,但不一定出现在`PATH`中。 **加载示例:** ```java import ...

    loadLibrary msc error:java.lang.UnsatisfiedLinkError:

    loadLibrary msc error:java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file “/data/app/com.example.xflinean-1/base.apk”],nativeLibraryDirectories=[/vendor/lib, /system/...

    java.lang.System类.pdf

    Java中的`java.lang.System`类是Java核心库中不可或缺的一部分,它是系统级操作的主要入口点。这个类提供了很多静态字段和方法,用于处理系统级别的任务,如输入输出流管理、系统属性获取、时间戳获取以及资源加载等...

    Android代码-ReLinker

    ReLinker A robust native library loader for Android. More information can be found in our blog post ...at java.lang.Runtime.loadLibrary(Runtime.java:365) at java.lang.System.loadLibrary(S

    jacob.jar1.19及使用方法

    at java.lang.System.loadLibrary(System.java:1028) at com.jacob.com.LibraryLoader.loadJacobLibrary(LibraryLoader.java:184) at com.jacob.com.JacobObject.<clinit>(JacobObject.java:107) at MsWordEdit....

    MAC下java调用opencv包含opencv_454.jar和libopencv_java454.dylib

    在实际开发中,可能还需要考虑兼容性问题,比如OpenCV的版本与操作系统、Java版本之间的兼容性,以及OpenCV库与特定硬件(如GPU)的交互。此外,对于复杂的计算机视觉任务,可能需要深入学习OpenCV的API,了解各种...

    environments was not found on the java.library.path: E:\\Program Files (x86)\\Java

    当Java程序试图通过`System.loadLibrary()`或`Runtime.getRuntime().loadLibrary()`方法加载非Java代码的本地库时,JVM会沿着这个路径寻找对应的库文件。 错误描述中提到的"NULL"可能是博主在遇到问题时没有提供...

    java.lang.UnsatisfiedLinkError: %1 不是有效的Win32应用程序错误解决

    Java.lang.UnsatisfiedLinkError是一种常见的错误类型,解决方法主要是检查JDK版本与操作系统的兼容性、DLL库文件的版本是否与JDK版本兼容、删除系统中的64位JDK,然后重新安装32位JDK等。同时,使用JNA提供的Native...

    安卓加载so卡死问题复现

    3. 在Java代码中,使用`System.loadLibrary`加载.so文件。 4. 运行应用在目标低版本智能电视盒子上,观察是否出现卡死现象。 解决此类问题的方法有: 1. 检查和更新gnustl库:确保使用的gnustl版本与Android系统...

    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

    opencv-java460-windows-64

    System.loadLibrary(Core.NATIVE_LIBRARY_NAME); } public static void main(String[] args) { Mat image = Imgcodecs.imread("path_to_your_image.jpg"); if (image.empty()) { System.out.println("无法...

    opencv-java454_linux.zip,包含opencv-454.jar和libopencv_java454.so

    5. **初始化OpenCV**:在Java程序开始时,需要调用`System.loadLibrary(Core.NATIVE_LIBRARY_NAME)`来加载本地库。 6. **编写代码**:现在你可以使用OpenCV的API进行图像处理和计算机视觉任务了。例如,读取图像、...

    opencv4.5.1-java-jar dll.zip

    6. **集成与使用**:在Java项目中使用OpenCV,需要将`opencv-451.jar`添加到项目的类路径中,并确保系统路径中包含了对应的dll文件。同时,需要正确配置JNI,以便Java代码能正确调用到OpenCV的原生库。 7. **示例...

    android 串口驱动

    android 串口驱动源代码 package android.serialport; import java.io.File; import java.io.FileDescriptor; import java.io.FileInputStream; import java.io.... System.loadLibrary("serial_port"); } }

    zebra连接打印机dll包

    在Java环境中与斑马打印机进行通信时,由于Java原生不支持直接操作硬件,我们需要借助特定的驱动或库来实现。本话题主要涉及的是“zebra连接打印机dll包”,这个dll包正是为了帮助Java程序与斑马打印机建立连接而...

Global site tag (gtag.js) - Google Analytics