函数名: memset 
功  能: 设置s中的所有字节为ch, s数组的大小由n给定 
用  法: void *memset(void *s, char ch, unsigned n); 
(1)你用的应该不对吧
(2)至于下面的赋值,我不懂jstring是什么?

解决方案 »

  1.   

    这个大概因为C中没有字符串的概念的缘故吧(不好意思,我是菜鸟),
    我也有过这样的经历。后来改成字符数组,大概成功了,
    太久远了,明天帮你看看。 请教 toney_2001(toney),您能否指点一二jstring的用法?万分感谢!!!
      

  2.   

    jstring是这个:
    http://java.sun.com/products/jdk/1.2/docs/guide/jni/spec/types.doc.html#15773
      

  3.   

    没有研究明白JNI,这种Java程序写起来意义不大,还不如用VC呢,因为Java的最大好处就是跨平台,不用去考虑jint,jchar等这些类型在不同系统平台上的长度
      

  4.   

    我现在取返回的字符串,在java编译器中总是出现java.lang.NullPointerException的问题。说明vc的dll还是没把值传过来啊。
    我现在传int、char都可以的,但传string、char[]都不行,都会出现上述错误。
    怎么办呢?高手帮忙啊。
      

  5.   

    test.java中声明  public native char[] Justtry();//声明本地方法
    vc的trydll中实现Justtry函数:
       JNIEXPORT jcharArray JNICALL Java_test_Justtry
      (JNIEnv *env, jobject obj)
    {
    char temp[100] = "test 12345";
    return temp;}再在java中调用
       char buff[]= new char[100];
       buff = Justtry();
    就会出现java.lang.NullPointerException的问题。
    如何能在java中得到Justtry()的值??????
    急!!!!
    各位大哥多帮忙小女子啊。谢谢~~~~~~~!!!!
      

  6.   

    不好意思小nancy,昨天误人子弟了   *^_^*
    现在给你解答  :)java中的字符串参数是16位unicode字符;c中的字符串是以null结尾,其字节以一个字节表示。java本地接口(jni)有两类函数,一类是将java字符串转化为utf;另一类是把
    他们转换为unicode字符数组,即jchar数组。JNI函数用来读取和创建jstring对象。
    NewStringUTF()函数从一个包含utf格式编码字符的char类型数组中创建一个jstring对象。
    不过,JNI函数的调用方式有点奇怪,这里给你一个使用NewStringUTF()函数的例子。
    JNIEXPORT jint JNICALL Java_Hello_GetMsg
      (JNIEnv *env, jobject obj, jstring ch)
    {
    HINSTANCE hLibrary;
             _GETMSG GetMsg;
             int temp;
    int res;
    char msg[256];

             GetMsg=(_GETMSG)GetProcAddress(hLibrary,"GetMsg");  
    res = GetMsg(msg);
    printf("getmsg in trydll,res:%d\n",res);
    printf(msg);
             ch = (*env) ->NewStringUTF(env, msg);
             FreeLibrary(hLibrary);
    return ch;
    }
    GOOD LUCK!! :)
      

  7.   

    所有jni函数的调用都使用env指针,它是任意一个本地方法的第一个参数。
    env指针是指向一个函数指针表的指针(如图),因此,必须在每个jni函数访问前加前缀
    (*env)->,以确保间接引用函数指针。使用时只需提供(*env)->前缀,无需关心
    函数指针表。
          _____________       _____________      ______________
    env  |         ----|---->|         ----|--->|    保留      |
          -------------       -------------      --------------
                             |     。      |    |     保留      |
                             |     。      |     --------------
                             |     。      |    |     保留      |
                              -------------      --------------
                                                |     保留      |
                                                 --------------
                                                | GetVersion  --|--->
                                                 --------------
                                                | Define Class -|--->
                                                 ---------------
                                                | Find Class ---|--->
                                                 ---------------
                                                |      。       |
                                                |      。       |
                                                |      。       |
                                                 ---------------
    hehe 
      good luck!  :)
      

  8.   

    to stars_of_leo(星空天马) :
    非常感谢你的意见,我试过了,现在可以传递字符串了。但是传递数字和字母可以,传递中文不可以啊,显示出来全部是问号。能再给点意见吗?
       谢谢了,帅哥!!!
      

  9.   

    new String(str.getBytes("8859_1"))
      

  10.   

    换个方法。
    API : Accessing Java strings from C code
    ·jstring NewStringUTF(JNIEnv* env, const char bytes[])
      从UTF字符串中返回一个新的Java字符串对象,若不能创建该字符串对象,则返回null。
      参数:
          env JNI接口指针,下同
          bytes 以null结尾的UTF字符串·jsize GetStringUTFLength(JNIEnv* env, jstring str)
      返回UTF编码所需的字符个数
      参数:
          str Java字符串对象·const jbyte* GetStringUTFChars(JNIEnv* env, jstring str, jboolean* isCopy)
      返回指向字符串的UTF编码的指针,若不能创建,返回null。
      该指针在调用ReleaseStringUTFChars()之前一直有效。
      参数:
          str Java字符串对象
          isCopy 若进行拷贝,指向以JNI_TRUE填充的jboolean,
    否则指向以JNI_FALSE填充的jboolean·Void ReleaseStringUTFChars(JNIEnv* env, jstring str, const jbyte bytes[])
      通知虚拟机本地代码不再需要通过bytes访问Java字符串
      参数:
          str Java字符串对象
          bytes 由GetStringUTFChars返回的指针·jstring NewString(JNIEnv* env, jchar chars[], jsize length)
      返回基于Unicode字符串的新Java字符串对象,若不能创建该对象则返回null。
      参数:
          bytes 以null结尾的UTF字符串
          length 字符串中的字符数目·jsize GetStringLength(JNIEnv* env, jstring string, jboolean* isCopy)
      返回字符串中的字符个数
      参数:
          string Java字符串对象
    ·const jchar* GetStringChars(JNIEnv* env, jstring string, jboolean* isCopy)
      返回指向一个字符串的Unicode编码的指针,若不能创建该字符数组返回null。
      该指针在调用ReleaseStringChars()前一直有效。
      参数:
          string Java字符串对象
          isCopy 若进行拷贝,指向为null或以JNI_TRUE填充的jboolean,
    否则指向以JNI_FALSE填充的jboolean·Void ReleaseStringChars(JNIEnv* env, jstring string, const jchar chars[])
      通知虚拟机本地代码不再需要通过chars访问Java字符串。
      

  11.   

    以上是env的api。按照上面所说的,这里应用(i guess)没有utf的那类方法,
    但是我今天试了试,没有utf的那一类传出的结果只是字符串的
    首字符。
    你可以自己试试。试通了告我一声。 谢谢!! :)
      

  12.   

    不知你试过用NewString()方法没?
    JNIEXPORT jint JNICALL Java_Hello_GetMsg
      (JNIEnv *env, jobject obj, jstring ch)
    {
    HINSTANCE hLibrary;
             _GETMSG GetMsg;
             int temp;
    int res;
    char msg[256];
             jsize length;  //添加该变量

             GetMsg=(_GETMSG)GetProcAddress(hLibrary,"GetMsg");  
    res = GetMsg(msg);         length = msg.length;//赋值 printf("getmsg in trydll,res:%d\n",res);
    printf(msg);
             ch = (*env) ->NewString(env, msg, length);
             FreeLibrary(hLibrary);
    return ch;
    }试试看,别灰心,没准你是第一个成功的(我知道的人当中 :)),
    我最近工作忙,而且……,算了,有些事情不好在这儿说。
    祝你成功!:)
      

  13.   

    我做的实验和你的程序正好是个反过程,用的
    ·jsize GetStringLength(JNIEnv* env, jstring string, jboolean* isCopy)
    ·const jchar* GetStringChars(JNIEnv* env, jstring string, jboolean* isCopy)
    ·Void ReleaseStringChars(JNIEnv* env, jstring string, const jchar chars[])
    这三个方法。但是换成这类方法后接收到从java传过来的字符串不全。而用以下这类方法则传输中文错误:
    ·jsize GetStringUTFLength(JNIEnv* env, jstring str)
    ·const jbyte* GetStringUTFChars(JNIEnv* env, jstring str, jboolean* isCopy)
    ·Void ReleaseStringUTFChars(JNIEnv* env, jstring str, const jbyte bytes[])不知那位高手能够搞定,帮帮忙,我可以另开贴子给分  :)
      

  14.   

    不是用UTF的,我给你贴一个吧
      

  15.   

    用ATL的
    jstring CreateJString(JNIEnv* env,const char* s)
    {
    if (s == NULL)
    return NULL;
    USES_CONVERSION;
    LPOLESTR ss = A2OLE(s);
    return env->NewString(
    (const jchar*)ss,(jsize)lstrlenW(ss));
    }
      

  16.   

    不用ATL的
    jstring CreateJString(JNIEnv* env,const char* s)
    {
    if (s == NULL)
    return NULL;
    WCHAR buffer = new char[lstrlen(s)+1];
    int len = ::MultiByteToWideChar(CP_ACP,NULL,s,lstrlen(s),buffer,lstrlen(s)+1);
    return env->NewString(buffer,(jsize)len);
    }