昨天在调试程序时,发现调用jni时,程序经常崩溃。开始一直找不到原因,不知道崩溃在什么地方。晚上加班时,请大牛帮我看问题,后来确认是java层与jni之间字符串数据传递,未对字符串进行编码解码操作。
附上log
03-27 10:16:13.711: W/dalvikvm(1359): JNI WARNING: input is not valid Modified UTF-8: illegal start byte 0xbe
03-27 10:16:13.711: W/dalvikvm(1359): string:
03-27 10:16:13.711: E/dalvikvm(1359): VM aborting
03-27 10:16:13.736: A/libc(1359): Fatal signal 11 (SIGSEGV) at 0xdeadd00d (code=1)
解决办法,java层在调用jni接口前,将需要传递的字符串进行编码, 使用URLEncoder.encode(string)进行编码。当然java层在获取jni接口返回的字符串时也需要对该字符串进行解码,使用URLDecoder.decode(string)进行解码。jni层内部在使用java层传递的字符串时,根据情况选择编码或解码操作。