在做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)
不知道是哪出错了?高手指点下。

解决方案 »

  1.   

    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();
       }
    }
      

  2.   

    你用什么编译的?vc的还是gcc
      

  3.   

    编译的时候要把头文件和别的库都放到dll里,另外如果用MinGW GCC的话要加-kill-at,应该就可以了
      

  4.   

    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方法