日期:2014-05-20  浏览次数:20956 次

调用dll,用JNI和JNA都出现错误
JNI的是:
Exception in thread "main" java.lang.UnsatisfiedLinkError: Sky_interface.SkyJavaAPI.OpenDevice([I[BS)I
at Sky_interface.SkyJavaAPI.OpenDevice(Native Method)
at Sky_interface.JavaTest.Open(JavaTest.java:45)
at Sky_interface.JavaTest.main(JavaTest.java:17)
JNA的是:
Exception in thread "main" java.lang.UnsatisfiedLinkError: Error looking up function 'OpenDevice': ???????¨?
at com.sun.jna.Function.<init>(Function.java:179)
at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:344)
at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:324)
at com.sun.jna.Library$Handler.invoke(Library.java:203)
at $Proxy0.OpenDevice(Unknown Source)
at skyencard.JavaTest.Open(JavaTest.java:47)
at skyencard.JavaTest.main(JavaTest.java:19)
各位大哥,根据你们的经验,判断大概是哪个地方出现问题?
新手求指点!

------解决方案--------------------
DLL中有OpenDevice这个方法吗?
方法参数对吗?
你调用的参数形式是:
([I[BS)I
表示:入参是整数数组、字节数组和short,返回类型整型
符合这种参数形式的OpenDevice方法可能在DLL中并不存在。
------解决方案--------------------
JNIEXPORT jint JNICALL Java_com_ekingstar_shsfdxbcyd_readcard_PayControl_userCost
(JNIEnv * env, jobject cl,jint price);

private native int userCost(int price);

这两个方法楼主自己对照一下吧,这两个方法就是native映射,java会通过这个native方法去c里面找这个函数,你可以通过javah 命令来生成.h文件,这样保证不会错。记住,方法名也是有规定的,不能乱取。


------解决方案--------------------
探讨
引用:

你看看,参数个数都不对,函数名称也不一致。

建议你用JNA继续试试,JNI就不要试了。

public interface SkyEnCard extends Library
{
SkyEnCard INSTANCE =(SkyEnCard) Native.loadLibrary("SkyEnCard",SkyEnCard.class);
……