问题描述
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后,再加载调用,同样出现问题