Chinaunix

标题: jni 这是什么毛病? [打印本页]

作者: zylthinking    时间: 2015-07-08 12:58
标题: jni 这是什么毛病?
一段代码中发生崩溃, 发现可能出现了非法内存写入, 最终怀疑到如下代码段可能导致了非法写入, 但现象诡异的很
  
如下, 这样崩溃
         jint length =  (*env)->GetArrayLength(env, pixel);
         (*env)->GetByteArrayRegion(env, pixel, 0, length, (jbyte *) mbuf->ptr[1]);
这样也崩溃:
         jint length =  (*env)->GetArrayLength(env, pixel);
         jbyte* buf = (*env)->GetByteArrayElements(env, pixel, NULL);
         memcpy(mbuf->ptr[1], buf, length);
         (*env)->ReleaseByteArrayElements(env, pixel, buf, 0);
  
但这样不崩溃
         jint length =  (*env)->GetArrayLength(env, pixel);
         jbyte* buf = (*env)->GetByteArrayElements(env, pixel, NULL);
         memset(mbuf->ptr[1], 0, length);
         (*env)->ReleaseByteArrayElements(env, pixel, buf, 0);
  
谁能告诉我这是哪里出了问题?
作者: zylthinking    时间: 2015-07-08 13:52
又发现如下现象, 不知道因为new 出来的地址不一样了导致了不崩溃还是因为什么原因导致 传递 data 作为参数有问题导致的  
     
    public void onPreviewFrame(byte[] data, Camera camera) {
         Log.e("zylthinking", "buffer_size = " + buffer_size + ", length = " + data.length);
         int n = mmapi.pixel_push(something, new byte[buffer_size]); ------------------------不崩溃
         int n = mmapi.pixel_push(something, data); -----------------------崩溃
         if (n == -1) {
             Looper looper = handler.getLooper();
             looper.quit();
         } else {
             camera.addCallbackBuffer(new byte[buffer_size]);
         }
     }
作者: rover12421    时间: 2015-07-08 14:20
(*env)->ReleaseByteArrayElements(env, pixel, buf, 0);
调用这句之后,buf就不能再使用了
  1. jint length =  (*env)->GetArrayLength(env, pixel);
  2.          jbyte* buf = (*env)->GetByteArrayElements(env, pixel, NULL);
  3.          memcpy(mbuf->ptr[1], buf, length);
  4.          (*env)->ReleaseByteArrayElements(env, pixel, buf, 0);
复制代码
仅仅看这段,应该没啥问题,mbuf->ptr[1]是啥?
ReleaseByteArrayElements 需要注意最后一个参数,我就被坑过
作者: zylthinking    时间: 2015-07-08 14:42
rover12421 发表于 2015-07-08 14:20
(*env)->ReleaseByteArrayElements(env, pixel, buf, 0);
调用这句之后,buf就不能再使用了仅仅看这段,应该 ...


之后 buf 就是没有使用啊, 这代码是看不出问题
现在这诡异的内存问题简直莫名其妙啊

ReleaseByteArrayElements
没关系, memcpy 变成 memset 就屁事没了

java 代码不传 data 而是随便 new 一个一样大的数组, 也是屁事没有
就不明白是什么玩意了




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2