`

System.load 和 System.loadLibrary

    博客分类:
  • 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代码库,但它们的用法和工作原理存在一些差异。以下...

    安卓加载so卡死问题复现

    这里我们关注的焦点是`System.loadLibrary`方法导致的应用卡死,这通常与C++运行时库(如gnustl)有关。在描述中提到,这个问题已经定位到gnustl,这是一个广泛使用的GNU C++标准模板库,用于Android NDK开发。 ...

    深入分析Android加载so文件

    Java层加载so的函数有两个:System.load(String pathName)和System.loadLibrary(String libName)。这两个函数的区别就是load函数的参数是so文件的绝对地址,而loadLibrary的参数是so的名称,这个so文件必须放在apk的...

    jni动态加载方式示例工程

    `System.loadLibrary()`会自动寻找对应的库文件,通常是根据系统路径和库名规则(如libname.so)来查找,而`System.load()`则需要提供库的完整路径。 以下是一个简单的示例,展示了如何在Java中动态加载本地库: `...

    Android代码-ReLinker

    java.lang.UnsatisfiedLinkError: Couldn't load stlport_shared from loader dalvik.system.PathClassLoader: findLibrary returned null at java.lang.Runtime.loadLibrary(Runtime.java:365) at java.lang.System...

    直接加载并调用DLL中函数

    这是一个从内存(资源形式)直接加载并调用DLL中函数的例子。 xDll工程只是一个测试用的dll,附上代码,编译出的xDll.dll直接放在testLoadDll工程目录下 testLoadDll是实际测试代码,从资源直接加载Dll并调用其导出...

    C#中动态加载和卸载DLL

    通常,C++使用LoadLibrary和FreeLibrary函数来完成这一任务,但C#的设计有所不同,它依赖于.NET框架的垃圾回收(GC)机制来管理资源。然而,这限制了在程序运行时动态卸载DLL的能力,因为GC并不总是立即回收不再使用...

    C#中加载和卸载DLL

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

    运行时动态导入so库文件。用最少的代码实现动态导入本地so库文件示例设定so放在assets文件夹下.rar

    3. **加载.so库**: 使用System.load()或System.loadLibrary()函数加载.so库。System.load()接受一个文件路径作为参数,而System.loadLibrary()则期望一个库名(不包含".so"后缀)。在这种情况下,因为.so文件是临时...

    centos7环境下编译opencv4.5.4生成的so和jar

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

    java.lang.System类.pdf

    - `load()`和`loadLibrary()`方法分别用于加载动态链接库和本地库。 6. **安全**: - `getSecurityManager()`返回当前的系统安全经理,如果未设置则返回`null`。 - `setSecurityManager()`允许设置安全管理器,...

    Windows环境下Java加载DLL.docx

    System.loadLibrary("chilkat"); } catch (UnsatisfiedLinkError e) { System.err.println("Native code library failed to load.\n" + e); System.exit(1); } } public static void main(String argv[]) { ...

    关于dll加载后调用函数的问题.md

    首先,我们在写DLL的时候,需要在DLL函数里面加上DllMain函数,可以在这里面写上你自己的函数,windows在用LoadLibrary加载DLL后调用会DllMain函数,而你把自己的函数已经先写在在DllMain里面了,那么你的函数也自然就执行...

    关于海康威视HCNetSDK.dll的调用

    海康威视HCNetSDK.dll是海康威视公司为开发者提供的一款用于集成其设备和服务的动态链接库,主要用于视频监控、录像回放等安防领域的功能实现。在Java环境中,由于Java本身不支持直接调用C/C++编写的DLL文件,我们...

    安卓so库动态加载示例.zip

    - **使用System.loadLibrary()**:通常,Android系统会自动加载在AndroidManifest.xml中声明的so库。但要实现动态加载,需要使用`System.loadLibrary()`方法,并传入库名(不包含.so后缀)。 - **查找路径**:`...

    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/...

    Android Native库的加载及动态链接的过程

    System.loadLibrary()方法将调用loadLibrary0()方法,该方法将加载指定的Native库文件。loadLibrary0()方法将首先检查库名是否包含目录分隔符,如果包含,则抛出UnsatisfiedLinkError异常。然后,它将通过...

    Java System类详解_动力节点Java学院整理

    - `System.loadLibrary()`:加载指定的本地库名,JVM会自动寻找对应的库文件。 4. **数组复制**: - `System.arraycopy()`:高效地复制一个数组的一部分到另一个数组。 5. **JVM操作**: - `System.gc()`:触发...

    java使用JNI调用C++动态链接库(初学必备)

    2. **动态链接库加载**:在`HelloWorld`类的`static`块中,通过`System.loadLibrary()`或`System.load()`方法加载动态链接库。`System.loadLibrary()`通常会自动寻找与类名匹配的库名(如`HelloWorld.dll`),而`...

Global site tag (gtag.js) - Google Analytics