解决:java调用Jni.dll时找不到依赖库的问题(Can't find dependent libraries)

        背景:我的工作是C++,目前开发一个模块,针对java调用的,所以需要开发一个Jni动态库,暂定名字:"AJni.dll";这个动态库是依赖的是核心库“B.dll”还有用到mfc。

        开发完成用java测试时发现,当com包放在核心库目录bin下时,程序无问题;当放在其他目录下,程序会报错:

Exception in thread "main" java.lang.UnsatisfiedLinkError: C:\...\bin\AJni.dll: Can't find dependent libraries

        提示找不到依赖库,把bin目录配置到环境变量中没有问题;

        那么问题原因就出来了:还是环境变量的问题,bin目录配置到环境变量中就正常运行。

        分析:java中Load(AJni.dll)时,因为AJni.dll还需要依赖其他的库(比如mfc的库,注意:动态链接B.dll是在程序运行后执行loadlibrary时才会加载B.dll),而在java的当前工作目录下找不到这个依赖库,导致报错,所以第一步想法,是先将Jni项目属性设置为静态库中使用mfc,并将属性c++中代码生成设置为多线程(MT),如图:

解决:java调用Jni.dll时找不到依赖库的问题(Can't find dependent libraries)_第1张图片

 

解决:java调用Jni.dll时找不到依赖库的问题(Can't find dependent libraries)_第2张图片

       

        将生成的dll替换过去,运行程序,原来的错误没有了,现在会报cpp程序中的加载库失败的错误,这个也是环境变量(应该说是工作目录)的问题,所以第二步操作就是,在Jni.cpp代码中修改:接口Start(...)中,加载接口库B.dll之前先设置当前工作目录(因为调用Start接口传的参数就是接口库的路径,直接把这个路径设置为工作目录),在加载完以后再将原来的工作目录设置回来。如图:

解决:java调用Jni.dll时找不到依赖库的问题(Can't find dependent libraries)_第3张图片

 

        最后再测试,就成功了。

 

        思想:找不到依赖库就还是路径和环境变量的问题,可以尝试通过设置工作目录来解决。

 

你可能感兴趣的:(C++,java)