在项目中遇到一个奇怪的现象,在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的传递呢?有兴趣的读者不妨做做试验哟!