load 与 loadLibrary

JNI 使用 Native 库时 一般用load 与 loadLibrary 两个方法,它们的区别主要如下分析。
加载的路径不同:System.load(String filename) 是从作为动态库的本地文件系统中以指定的文件名加载代码文件,文件名参数必须是完整的路径名且带文件后缀;而 System.loadLibrary(String libname) 是加载由 libname 参数指定的系统库(系统库指的是 java.library.path,可以通过 System.getProperty(String key) 方法查看 java.library.path 指向的目录内容),将库名映射到实际系统库的方法取决于系统实现,譬如在 Android 平台系统会自动去系统目录、应用 lib 目录下去找 libname 参数拼接了 lib 前缀的库文件。
是否自动加载库的依赖库:譬如 libA.so 和 libB.so 有依赖关系,如果选择 System.load("/sdcard/path/libA.so"),即使 libB.so 也放在 /sdcard/path/ 路径下,load 方法还是会因为找不到依赖的 libB.so 文件而失败,因为虚拟机在载入 libA.so 的时候发现它依赖于 libB.so,那么会先去 java.library.path 下载入 libB.so,而 libB.so 并不位于 java.library.path 下,所以会报错。
解决的方案就是先 System.load("/sdcard/path/libB.so") 再 System.load("/sdcard/path/libA.so"),但是这种方式不太靠谱,因为必须明确知道依赖关系;另一种解决方案就是使用 System.loadLibrary(“A”),然后把 libA.so 和 libB.so 都放在 java.library.path 下即可。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 C++ 中,可以使用 LoadLibrary 函数来动态加载一个 DLL 文件。这个函数的原型如下: ```c++ HMODULE LoadLibrary(LPCTSTR lpFileName); ``` 其中,lpFileName 参数指定 DLL 文件的路径,LoadLibrary 函数返回一个 HMODULE 类型的句柄,表示已加载的 DLL。 使用 LoadLibrary 加载 DLL 的基本流程如下: 1. 使用 LoadLibrary 函数加载 DLL 文件,获得 DLL 的句柄。 2. 使用 GetProcAddress 函数获得 DLL 中的函数地址。 3. 调用 DLL 中的函数。 4. 使用 FreeLibrary 函数释放 DLL。 下面是一个简单的示例代码,演示了如何使用 LoadLibrary 加载 DLL 文件并调用其中的函数: ```c++ #include <windows.h> #include <iostream> int main() { // 加载 DLL HMODULE hModule = LoadLibrary(TEXT("mydll.dll")); if (hModule == NULL) { std::cerr << "Failed to load DLL." << std::endl; return 1; } // 获取函数地址 typedef int (*MyFunc)(); MyFunc myFunc = reinterpret_cast<MyFunc>(GetProcAddress(hModule, "MyFunc")); if (myFunc == NULL) { std::cerr << "Failed to get function address." << std::endl; FreeLibrary(hModule); return 1; } // 调用函数 int result = myFunc(); std::cout << "Result: " << result << std::endl; // 释放 DLL FreeLibrary(hModule); return 0; } ``` 需要注意的是,LoadLibrary 函数加载的 DLL 文件必须与应用程序在同一目录或系统目录下,或者在环境变量 PATH 所指定的目录中。否则需要指定完整路径或使用 SetDllDirectory 函数设置额外的搜索路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值