奇怪的JNI的问题

在项目中遇到一个奇怪的现象,在java中使用jni调用c++的库时,总是会出现崩溃现象,java的堆栈一直显示错误在jni调用中,具体错误在strlen+0x10,看样子是strlen计算指

针所指的内容导致的一个错误,但是仔细查了一下,并不存在这种情况,一直找原因,看内存是否释放?看c++客户端是否存在指针为空指针,数组是否越界等等,结果都找不出原

因来,于是只好将java端传递的字符打印出来,并将C++库刚刚接收以及所有可能出现错误的日志打印出来,发现在java传递这种字串时:

String javastr = "abcde^@12345";

注意^@表示ascii字符为0的字符,此字串的长度为11;传递到客户端后,变成了:

char *key = "abcde<00>12345";

注意<00>表示null字符,此时用了一个指针,但是获得的字串长度为10了,这样到strlen处计算肯定会发生错误。

在c/c++语言中,数组字串中肯定不存在这样的字符串abcde^@12345,因为^@会截断12345,而java中允许出现^@,这样就导致了上述的这个问题。在jni调用c/c++库的时候,如果

用数组或指针获取,肯定会发生问题,这可能是jni的一个bug。jni部分调试代码如下:

    const char *key = env->GetStringUTFChars(string, 0);
    /* 
    int i, l = strlen(key);
    for (i = 0; i < l; i++) {
        printf("c[%d]: %u\n", i, (unsigned char)key[i]);
    }
    */
    unsigned short exists = jsClient->exists(key);
    env->ReleaseStringUTFChars(string, key);

那么在c++当中,如果用string来接收java的传递呢?有兴趣的读者不妨做做试验哟!

Categories

| | 评论(0)

发表评论

May 2010

            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          

关于此日记

此日记由 Cnangel 发表于 March 22, 2009 10:07 PM

此Blog上的上一篇日记关于编译的几点须知

此Blog上的下一篇日记轻松的一天

首页归档页可以看到最新的日记和所有日记。

归档

Powered by Movable Type 5.02