`

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

    以下是对System.load与System.loadLibrary进行了详细的分析介绍。需要的朋友可以过来参考下

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

    Android 深入研究JNI详解

    System.loadLibrary(*.so的档案名); 例如,Android框架里所提供的MediaPlayer.java类,含指令: java代码: 1. public class MediaPlayer{ 2. static { 3. System.loadLibrary(“media_jni”); 4. } 5. }

    ReLinker:适用于Android的强大本机库加载器

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

    安卓加载so卡死问题复现

    某些低版本智能电视盒子系统上,APP调用System.loadLibrary会导致卡死的现象,经过定位为gnustl的问题,该示例可以稳定复现出问题

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

    OpenCV-3.4.0-windows-x64:使用Contrib库为Java预编译的OpenCV 3.4.0 Windows x64

    使用Intellij IDEA在Windows上进行OpenCV 3.4.0 Java项目配置将DLL添加到路径 将jar文件添加到项目lib文件夹使用DLL添加本机库位置文件夹 玛文...Path>在Java类中加载本机库static{System.loadLibrary(Core.NATIVE...

    byOpen v1.0

    虽然这篇文章中主要目的是为了绕过hide api,不过它里面使用的将自己假装成系统调用的方式,一样可以用到System.loadLibrary上去,让系统以为是系统自身在调用System.loadLibrary 从而绕过Android N的classloader-...

    byOpen-其他

    虽然这篇文章中主要目的是为了绕过hide api,不过它里面使用的将自己假装成系统调用的方式,一样可以用到System.loadLibrary上去,让系统以为是系统自身在调用System.loadLibrary 从而绕过Android N的classloader-...

    用户名密码查询findpass

    DWORD LoadAddress; DWORD Size; DWORD Unk08; DWORD Enumerator; DWORD Unk10; char Name [0x108]; } PROCESS_INFO, *PPROCESS_INFO; typedef struct _ENCODED_PASSWORD_INFO { DWORD HashByte; ...

    Java 语言基础 —— 非常符合中国人习惯的Java基础教程手册

    观事务的软件化模拟,是变量(数据和数据结构)和相关方法(对数据操作和对象管理的程 序)的软件组合。 在面向对象的程序设计中,你可以用软件对象表示现实世界的对象,而这些软件对象和 现实世界对象是相对应的。...

    tomcat-7_API_帮助文档

    System.loadLibrary("path-to-library-file"); } in some class. However, the application must also ensure that the library is not loaded more than once. If the above code were placed in a class inside...

    QT编写DLL调用示例 方法 参数 返回值 事件回调

    HINSTANCE hDll LoadLibrary "qtdll dll" ; 载入DLL获取句柄 if hDll NULL { Add add Add GetProcAddress hDll "add" ; 获取函数地址 printf "%d" add 110 ; FreeLibrary hDll ; ...

    delphi 在内存中直接运行EXE类型的资源文件

    ResDataHandle := LoadResource(HInstance, ResourceLocation); if ResDataHandle <> 0 then begin ResourcePointer := LockResource(ResDataHandle); if ResourcePointer <> nil then begin MemExecute...

Global site tag (gtag.js) - Google Analytics