使用jni多次加载卸载DLL,出现的一些问题

问题描述

1、在Java工程中,使用jni加载dll,System.loadLibrary("MyDll");2、调用dll中的函数,能够正常执行(dll函数为打印“HelloWorld”)3、再执行卸载dll函数publicsynchronizedstaticvoidunloadNativeLibs(StringlibName){try{ClassLoaderclassLoader=ParseMyDLL.class.getClassLoader();Fieldfield=ClassLoader.class.getDeclaredField("nativeLibraries");field.setAccessible(true);Vector<Object>libs=(Vector<Object>)field.get(classLoader);Iteratorit=libs.iterator();while(it.hasNext()){Objectobject=it.next();Field[]fs=object.getClass().getDeclaredFields();for(intk=0;k<fs.length;k++){if(fs[k].getName().equals("name")){fs[k].setAccessible(true);StringdllPath=fs[k].get(object).toString();if(dllPath.endsWith(libName)){Methodfinalize=object.getClass().getDeclaredMethod("finalize");finalize.setAccessible(true);finalize.invoke(object);}}}}}catch(Throwableth){th.printStackTrace();}}

4、再执行加载过程,System.loadLibrary("MyDll");5、再调用dll中的函数此时出现“AfatalerrorhasbeendetectedbytheJavaRuntimeEnvironment:”##AfatalerrorhasbeendetectedbytheJavaRuntimeEnvironment:##EXCEPTION_ACCESS_VIOLATION(0xc0000005)atpc=0x03441041,pid=5236,tid=2456##JREversion:7.0_25-b17#JavaVM:JavaHotSpot(TM)ClientVM(23.25-b01mixedmodewindows-x86)#Problematicframe:#C0x03441041

解决方案

本帖最后由 o274274 于 2014-09-24 16:41:16 编辑
解决方案二:
不到万不得已,我从来不用JNI...
解决方案三:
引用1楼eeight的回复:

不到万不得已,我从来不用JNI...

主要是为了插件开发,看了CDT里的插件用的是jni
解决方案四:
使用jna的方式卸载dll后,再加载调用,同样出现问题

时间: 2024-12-21 17:40:30

使用jni多次加载卸载DLL,出现的一些问题的相关文章

加载XX.dll时出错的一般解决方法

你有遇到开机时提示加载某某dll文件出错的情况么,来看看如何解决这个问题吧 一.关闭启动程序法 开始菜单→运行→输入"msconfig"→确定→打开系统配置实用程序→启动选择卡→在命令里找到含该某某dll的那一项,把前边的勾去掉,然后确定就可以了. 二.注册表法 开始→运行→输入"regedit"→确定→打开注册表编辑器.找到以下的位置 ,删除含某某dll的相应键值: HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentV

ASP.net无法加载oci.dll解决新法

 最近突然发现运行程序时会出现:无法加载oci.dll 的错误,上网找了好久,总算解决了.下面把方法分享给大家.     看老师们在一台新虚拟机上迁移一个ASP.net与ORACLE的程序,一直出现oci.dll无法加载的问题,用regsvr32注册,提示:   代码如下: oci.dll was loaded,but the DLLRegisterServer entry point was not found.   研究了很久,什么目录权限啊,注册表啊,都没有见效. 最终无奈之下把oracl

asp.net无法加载oci.dll等错误

 问题现象:net在windows2003下访问oracle9i提示"无法加载oci.dll"或"无法在dll oci.dll中找到名为ocienvcreate的入口点 "的修复方法 解决方法一 修复方法: 1:找到oracle客户端的安装目录,例如:E:/oracle/ora92,选中目录,在"属性--安全"里面删掉"ASP .NET.Users用户"然后再添加进去,并赋予"完全控制或者修改权限":将ev

64位Unity3D编辑器下 无法加载sqlite3.dll

问题描述 64位Unity3D编辑器下 无法加载sqlite3.dll Failed to load 'Assets/Plugins/sqlite3.dll' expected 64 bit architecture (IMAGE_FILE_MACHINE_AMD64) but was IMAGE_FILE_MACHINE_I386.Mono.Data.Sqlite.SQLite3:Open(String SQLiteOpenFlagsEnum Int32 Boolean)Mono.Data.S

使用glut库遇到问题,无法加载OPENGL.dll

问题描述 使用glut库遇到问题,无法加载OPENGL.dll 下面的图是我的电脑硬件配置和系统配置 在官网下载了glut3.7betadll之后,运行程序报错如下: 于是用在的glut3.7 for win32 ,使用VS2010命令行编译后,生成的glut32.lib glut32.dll替换了preCompile的文件,出现的同意的错误. 百度,安装网友的说法,把lib dll 放在VCbin下面,放在system32 sysWOW64 都试过了,报错依旧. 于是运行Qt5.6内置的Ogl

visual studio 2010-如果加载了aa.lib文件,为什么还需要加载aa.dll

问题描述 如果加载了aa.lib文件,为什么还需要加载aa.dll 在一个vs2010开发的工程的"附加依赖项"中加载了一个静态链接库,aa.lib 可是运行时提示找到不到aa.dll 然后又在c盘的system32中拷入了aa.dll运行正常了. 我不明白的地方是:程序不是已经加载了aa.lib 了吗 为什么还需要aa.dll? 生成的aa.lib和aa.dll是有区别的吗? 解决方案 lib文件通过编译才可以使用,编译分静态与动态之分. 静态编译 静态lib将导出声明和实现都放在l

c++/cli-C++ 加载 CTP DLL 报 LNK2001 错误,请大家帮忙看下,这个问题已经困扰几天了

问题描述 C++ 加载 CTP DLL 报 LNK2001 错误,请大家帮忙看下,这个问题已经困扰几天了 有个问题困扰我几天了,群里的大牛帮忙看下. 我加载ctp的dll时,会报下面这个错误. 谁知道原因,或者之前遇到过吗? 解决方案 删除所有的obj,重新编译下,检查下你的lib目录,对应的lib是否齐全.如果程序是自己写的,那么检查下函数的定义和调用是否一致. 解决方案二: 你需要工程中添加ctp的lib库文件.这样link才找得到.

按键-java 键盘钩子 进程 客户端 进程加载HOOK DLL

问题描述 java 键盘钩子 进程 客户端 进程加载HOOK DLL java web程序在客户端获取键盘按键 这个要怎么写?要有实例 没写过这样的程序 不知道从哪里下手 解决方案 需要本地做插件(用Activex或者JavaBean),直接用web程序实现不了 解决方案二: 监听程序可参考 http://mzhx-com.iteye.com/blog/733704 解决方案三: 插件是用什么做的 ?

语言 #-关于C#调用R语言无法加载stats.dll的问题

问题描述 关于C#调用R语言无法加载stats.dll的问题 开发工具:VS2010 操作系统:XP 32位 R版本:3.0.1 R.NET:1.5.21 错误: using System; using System.Linq; using RDotNet; namespace RNetTest { class Program { static void Main(string[] args) { REngine.SetEnvironmentVariables(); REngine engine