jni 异常Exception in thread "main" java.lang.UnsatisfiedLinkError: Usb_ChangePin

vickorfox 2009-07-03 04:03:53
在做jni调用vc的 dll。
java代码:

具体实现代码:


头文件:
JNIEXPORT jint JNICALL Java_www_testdll_vc_Vcdll_Usb_ChangePin
(JNIEnv *, jclass, jstring, jint, jstring, jint);

自己写的dll文件部分代码:

JNIEXPORT jint JNICALL Java_www_testdll_vc_Vcdll_Usb_ChangePin
(JNIEnv * env, jclass, jstring lpOldPin, jint lpOldPinLen, jstring lpNewPin, jint lpNewPinLen)
{
unsigned char * pin=( unsigned char *) (env)->GetStringUTFChars(lpOldPin,0);
if(strcmp((const char*)pin,(const char*)lpPinStr)!=0)
{
printf("输入旧口令不正确");
return 0;
}

return 0;
}

dll编译时通过了,没出错。
在java里面调用的时候出错了

Exception in thread "main" java.lang.UnsatisfiedLinkError: Usb_ChangePin
at www.testdll.vc.Vcdll.Usb_ChangePin(Native Method)
at www.testdll.vc.Vcdll.UsbChangePin(Vcdll.java:61)
at www.testdll.vc.CallFun.UsbChangePin(CallFun.java:112)
at testdll.TT.main(TT.java:11)


不知道是哪出错了?高手指点下。
...全文
454 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Cherformance 2009-07-03
  • 打赏
  • 举报
回复
public native static int Usb_ChangePin(String lpOldPin,int lpOldPinLen,String lpNewPin,int lpNewPinLen);
本地方法中的下划线去掉重新做一次试试
头文件中函数名Java_www_testdll_vc_Vcdll_Usb_ChangePin
本来预计是www.testdll.vc.Vcdll中的方法Usb_ChangePin
可能被解析为了www.testdll.vc.Vcdll.Usb的ChangePin方法
MT502 2009-07-03
  • 打赏
  • 举报
回复
编译的时候要把头文件和别的库都放到dll里,另外如果用MinGW GCC的话要加-kill-at,应该就可以了
MT502 2009-07-03
  • 打赏
  • 举报
回复
你用什么编译的?vc的还是gcc
vickorfox 2009-07-03
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 MT502 的回复:]
lpPinStr在哪定义的?
[/Quote]

这是我定义的一个全局变量,写在头文件里了。
MT502 2009-07-03
  • 打赏
  • 举报
回复
lpPinStr在哪定义的?
vickorfox 2009-07-03
  • 打赏
  • 举报
回复
java代码:
static
{
System.loadLibrary("Vcdll");
}
public native static int Usb_ChangePin(String lpOldPin,int lpOldPinLen,String lpNewPin,int lpNewPinLen);

public int UsbChangePin(String lpOldPin,int lpOldPinLen,String lpNewPin,int lpNewPinLen)
{
return this.Usb_ChangePin(lpOldPin, lpOldPinLen, lpNewPin, lpNewPinLen);
}


具体实现代码:

public void UsbChangePin()
{
Vcdll vd=new Vcdll();
BufferedReader in=new BufferedReader(new InputStreamReader(System.in));

try
{
System.out.println("输入旧的口令");

String oldpin;
oldpin=in.readLine();

System.out.println("输入新口令");
String newpin;
newpin=in.readLine();
System.out.println("在输入一遍");
String renewpin;
renewpin=in.readLine();
if(!newpin.equals(renewpin))
{
System.out.println("两次口令输入不一致,返回请重新输入");
UsbChangePin();
}
int oldpinlen=oldpin.length();
int newpinlen=newpin.length();

vd.UsbChangePin(oldpin, oldpinlen, newpin, newpinlen);
}catch(IOException e)
{
e.printStackTrace();
}
}

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧