本帖最后由 Java_Devil 于 2013-01-19 16:16:42 编辑

解决方案 »

  1.   

    推荐楼主用JNA技术来用java调用C或C++写的DLL,我前段时间也遇到了用java调用C++写的dll的问题,我是直接没写成,总是报错,N种错。最后用JNA解决了,貌似到现在一直没出问题,几个月了。
      

  2.   

    JNA可以返回char *吗?我上次试了一下、有问题、我本来就不懂C、你帮我看看是啥问题。或者给我提供下那种demo。网上查的都没返回值什么的、因为如果要用JNA、我需要去改动现存的DLL的源码。我不太会、 unsigned char *  __stdcall pcdgetdevicenumber(unsigned char *devicenumber)
    {
    // AfxMessageBox("hello",NULL,NULL);
    // memcpy((char *)devicenumber,"\x7\x6f\xda\x40\x00\x00",6);
    ///*
    devicenumber[0]=7;
    devicenumber[1]=111;
    devicenumber[2]=218;
    devicenumber[3]=64;
    devicenumber[4]=0;// */// unsigned char sn[20],cRet;
    // cRet=ReadSN(sn);
    // if(!cRet)two_one(sn+5,8,devicenumber);
    return devicenumber;}这个原型原本是返回char、return 0;被我改成了char *、我的java代码:
    public class TestDll {
    public interface CLibrary extends StdCallLibrary {
    CLibrary INSTANCE = (CLibrary) Native.loadLibrary("OUR_MIFARE",
    CLibrary.class); public String pcdgetdevicenumber(String value); } public static void main(String[] args) {
    String value="1";
    String b = CLibrary.INSTANCE.pcdgetdevicenumber(value);
    System.out.println(b+"-"+value); }}为什么我输出的是“INI~1\AppData\Local\Temp-1”这种玩意。、?
      

  3.   

    jna中要使用char *必须用CharByReference类型
      

  4.   

    jna中要使用char *必须用CharByReference类型
      

  5.   

    unsigned char  devicenumber[4];
    devicenumber[0]=7;
    devicenumber[1]=111;
    devicenumber[2]=218;
    devicenumber[3]=64;
    jstring deviceNum = env->NewStringUTF((const char*)devicenumber);
    return deviceNum;如果这样导致乱码,是编解码不一致导致,先搞清楚c这边是怎么编码的
    查看下deviceNum的值来推测不妨参考下这个例子
    // Prompt user for a C-string
       char outCStr[128];
       printf("Enter a String: ");
       scanf("%s", outCStr);    // not more than 127 characters
     
       // Step 3: Convert the C-string (char*) into JNI String (jstring) and return
       return (*env)->NewStringUTF(env, outCStr);
      

  6.   

    一个个来说,首先你的native函数有误:
    unsigned char  devicenumber[4] = {7,111,218,64};
    jstring deviceNum = env->NewStringUTF((const char*)devicenumber);
    return deviceNum;C/C++的字符串必须以\0结尾,所以你这里应该修改为const char devicenumber[5] ={7,111,218,64,'\0'};否则产生的字符串会有问题!
    --------------------------------------
    其次你的java端测试方法有误:
    System.out.println(str);
    这个str由7,111,218,64这几个字符组成,在ascii码中:
    7代表响铃符
    111代表小写字母o
    218不在ascii内
    64代表@符
    所以这样打印会显示:oÚ@所以这样打印是不对的!要这样打印:
    for(int i = 0 ; i < str.length(); i++){
        System.out.println((int)str.charAt(i));
    }
    你要分清啥是人类可阅读的字符好不