看到这个帖子http://topic.csdn.net/t/20020917/14/1030420.html#r_achor
按照最后那个例子进行操作
使用的是c++的文件,连接另一个库也是通过代码实现的
HINSTANCE HDll;
lpTrimFun Trim;
HDll=LoadLibrary("..这里是路径..\\Trim_Dll.dll");
Trim=(lpTrimFun)GetProcAddress(HDll,"Trim");
没有使用楼主提供的方式:cl   -Id:\jdk13\include   -Id:\jdk13\include\win32   -LD   java2dll.c   myDll.lib   -Fejava2dll.dll 这样的话,由于GetStringUTFChars()的返回值是const char *类型,所以Trim(strTemp); 就会一直报错:无法将const char *转换成char *没弄明白那边的楼主是如何实现的。
另外想请教该如何转换GetStringUTFChars()的返回值,在c++中将其作为普通的字符串来处理?

解决方案 »

  1.   

    你可以再开一个char*,然后memcpy
      

  2.   

    在http://www.blogjava.net/china-qd/archive/2006/04/29/44002.html找到了一个解决方法,和你的想法是一样的,没有使用memcpy简单复制,而是使用WideCharToMultiByte()进行了转换复制,因为编码不一致,不确定直接memcpy对中文会不会出现乱码的问题,一会测试下。
    现在主要是不明白,http://topic.csdn.net/t/20020917/14/1030420.html#r_achor这个帖子最后给出那个示例,为什么他的trim可以直接操作GetStringUTFChars()的返回值?
      

  3.   

    测试了下,代码如下:
    int length = (env)->GetStringLength(str );
        const jchar* jcstr = (env)->GetStringChars(str, 0 );
        char* rtn = (char*)malloc( length*2+1 );
    memcpy(rtn,jcstr,length);
    // Trim(rtn);
    printf("%d\n",length);
    printf("%s\n",rtn);str的内容是“i am the spider man!”,但是这样copy之后输出的只有一个i,其它什么都没有,length是20,按道理memcpy是完整复制,不会因为遇到字符串结束'\0'而结束,不过这里很奇怪,看来还是有必要进行编码转换的。
      

  4.   

    都了解点,没什么坏处吧
    问题是由于jni导致的,不是单纯的c++的问题
      

  5.   

    int length = (env)->GetStringUTFLength(str );
    const char* jcstr = (env)->GetStringUTFChars(str, 0 );
    char* rtn = (char*)malloc( length );
    memcpy(rtn,jcstr,length);
    printf("%d\n",length);
    printf("%s\n",rtn);这样呢
      

  6.   

    估计i的unicode编码的第二个字节码为0,memcpy遇到它时就停止复制了,所有只有i...
      

  7.   

    “如何转换GetStringUTFChars()的返回值,在c++中将其作为普通的字符串来处理?”
    其实在JNI这层没必要非得用jchar,直接用char*也可以。
    char * str=(char *)env->GetStringUTFChars(env,s,0);
    这样以后对str的读取就是对传入的jString参数的读取了。但是要注意,java中的String是不能改变的,所以对str的写操作时不会返回给java层的s的
      

  8.   

    补充一下,而且为什么要用memcpy呢,直接用strcpy不就可以