java JNI java调用c++

boyley 发布于 2013/12/27 14:55
阅读 854
收藏 0
各位师兄师姐好,小弟在java调用c++是出现了一个问题,几天了都没能解决,忘大家帮忙啊

我用eclipse cdt编写完c++代码后并成功编译生成了dll文件,可是在调用的时候出现了如下错误

Exception in thread "main" java.lang.UnsatisfiedLinkError: com.easytoo.union.jni.SUNSONPwd.SUNSON_OpenCom(II)I
	at com.easytoo.union.jni.SUNSONPwd.SUNSON_OpenCom(Native Method)
	at com.easytoo.union.jni.SUNSONPwd.getPinPwd(SUNSONPwd.java:73)
	at com.easytoo.union.impl.UnionPayDeviceImpl.getPinPwd(UnionPayDeviceImpl.java:210)
	at com.easytoo.union.impl.UnionPayDeviceImpl.main(UnionPayDeviceImpl.java:215)



我的c++编译器用的是MinGW。
看到这个错误的大概原因是找不着对应的方法。是怎么回事呢,望大家帮忙一下,都拖了几天了,公司给压力啊

加载中
0
子木007
子木007
帮顶。  不如试试 JNA 来得方便
0
x
xuzhw12
保证你动态库在PATH下面,然后重启eclipse,运行java。如果还不行,查看eclipse的details的configuration,找到java.library.path变量,看看这个变量是否包含了你那个dll所在的路径。如果不包含,说明重启eclipse无效,重启一下机器。重启机器还不行,就只能用depends.exe看看是不是还有哪些动态库缺失
0
高跟男爵
高跟男爵
请继续折腾  技术是折腾出来的
0
boyley
boyley

我知道是什么原因,但是不知道怎么解决,

问题是是MinGW编译器在编译的时候,是按照自己的方式进行编译的,没有按照java要求的方式进行编译,编译的方法名不标准,因此java在寻找方法的时候找不到该方法报错,我调试过,确实是。我通过dllexp工具查看到dll里的函数和java寻找的函数名称不一样,如下:

minGw生成的函数名:_Z52Java_com_easytoo_union_jni_SUNSONPwd_SUNSON_1OpenComP7JNIEnv_P8_jobjectll@16

而java寻找的方法是:_Java_com_easytoo_union_jni_SUNSONPwd_SUNSON_1OpenCom@16

我用visual studio试过,生成的方法正好是_Java_com_easytoo_union_jni_SUNSONPwd_SUNSON_1OpenCom@16,所有用visual studio生成的dll库不会报错,但是用MinGw就不行了,但是我要在linux下运行,不是在windows下运行,请问我该怎么设置MinGw的编译参数生成指定函数名称呢。

0
从今以后
从今以后
我觉得用JNA会比JNI简单点~~~
0
wangxigui
wangxigui

我用Android的NDK实现了java调用C++,编译没啥问题,为什么不用NDk呢


0
纳兰清风
纳兰清风
楼主用的是动态匹配还是静态的?
0
boyley
boyley
找到了解决办法了,我采用的是c编译器,所以编译出来的方法有问题,应该采用c++编译器.
返回顶部
顶部