关于vs2010下编译dll动态库,JNA接口在java中调用的问题
2011-11-17 15:36
453 查看
最近在搞关于把vs2010中的project,使之能够在Java下面运行,有一个调用本地接口的问题,JNI那个涉及到复杂细节太多,就使用了最新的JNA(java native access)
网上也给出了很多关于一些动态库的实例,如何在java程序中写接口,对jna的接口重载,初始化实例的问题,但涉及到如何的多数是如一些系统的动态库(msvcr.dll,c)等,往往缺乏如何写自己的实例,编译成动态库的问题,即使有的例子往往会遇到一个问题,很多帖子也有说明,如:
:java.lang.UnsatisfiedLinkError: Error looking up function ????
这个表示动态库已经被正确加载了,只是找不到函数罢了。于是花了很久的功夫找原因,最后才发现其实是一个所谓的decorated 和 undecorated 函数名的问题,
dll 通常默认在编译为动态库时,类似于函数重载的实现方法,把参数,所属类,返回值等信息通通加进函数名中,所以当JNA那头开始调用时,只是用原型的函数名
时,就出现找不到名字的情况。
而只要在函数之前加上一个extern "C" ,就相当于告诉动态库编译器,只用其undecorated 名字编译。dependency walker 中也有这个选项。
网上也给出了很多关于一些动态库的实例,如何在java程序中写接口,对jna的接口重载,初始化实例的问题,但涉及到如何的多数是如一些系统的动态库(msvcr.dll,c)等,往往缺乏如何写自己的实例,编译成动态库的问题,即使有的例子往往会遇到一个问题,很多帖子也有说明,如:
:java.lang.UnsatisfiedLinkError: Error looking up function ????
这个表示动态库已经被正确加载了,只是找不到函数罢了。于是花了很久的功夫找原因,最后才发现其实是一个所谓的decorated 和 undecorated 函数名的问题,
dll 通常默认在编译为动态库时,类似于函数重载的实现方法,把参数,所属类,返回值等信息通通加进函数名中,所以当JNA那头开始调用时,只是用原型的函数名
时,就出现找不到名字的情况。
而只要在函数之前加上一个extern "C" ,就相当于告诉动态库编译器,只用其undecorated 名字编译。dependency walker 中也有这个选项。
相关文章推荐
- JAVA 通过 JNA 调用 C程序 dll 函数传入中文参数问题
- Windows下java调用c的dll动态库--Dev_Cpp编译c生成dll
- JAVA调用DLL -- JNA和Fat Jar的使用及打包问题(二)
- VC6.0编译DLL,使用VS2010调用问题及解决方法
- JAVA调用DLL -- JNA和Fat Jar的使用及打包问题(一)
- java调用动态库(dll)的一些问题
- Android Studio 通过JNA调用 Clang编译的so库,以及Java JNA 调用x64dll,C# dllimport调用x86dll
- VC6.0编译DLL,使用VS2010调用问题及解决方法
- Java 通过 JNA 调用 DLL 返回 char * 字符串乱码问题的解决
- 将C语言编译成DLL并用C#进行调用以及关于从C#传输中文路径到C的DLL中打开文件的问题
- 提问:关于动态编译WebService为dll然后调用WebService的问题,无法返回xml文本
- JNA的一个小问题-调用dll处理字符串,在java中不能反映出字符串变化
- 探讨:关于动态编译WebService为dll然后调用WebService的问题,无法返回xml文本
- Android Studio 通过JNA调用 Clang编译的so库,以及Java JNA 调用x64dll,C# dllimport调用x86dll
- 关于Java调用32/64位dll的问题
- 关于VS Code使用code runner编译运行java出现报错乱码的问题
- 关于“JAVA中为什么没有了多继承并出现了接口”这一问题引发的一些思考
- java调用PHP接口时,遇到问题
- java调用动态库时,.dll文件路径问题
- 关于修改web app项目java代码后Eclipse没有重新编译的问题