在做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)
不知道是哪出错了?高手指点下。
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)
不知道是哪出错了?高手指点下。
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();
}
}
本地方法中的下划线去掉重新做一次试试
头文件中函数名Java_www_testdll_vc_Vcdll_Usb_ChangePin
本来预计是www.testdll.vc.Vcdll中的方法Usb_ChangePin
可能被解析为了www.testdll.vc.Vcdll.Usb的ChangePin方法