奇怪的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的传递呢?有兴趣的读者不妨做做试验哟!

Monthly Archives

Pages

Powered by Movable Type 7.7.2

About this Entry

This page contains a single entry by Cnangel published on March 22, 2009 10:07 PM.

关于编译的几点须知 was the previous entry in this blog.

轻松的一天 is the next entry in this blog.

Find recent content on the main index or look in the archives to find all content.