Android 使用本机内存作为相机缓冲区

Android 使用本机内存作为相机缓冲区,android,c++,memory-management,android-ndk,camera,Android,C++,Memory Management,Android Ndk,Camera,对于camera.addCallbackBuffer中的摄影机缓冲区,我想使用本机内存而不是Java堆 我写了一些代码,但它错了。我得到空数组 如何做好这件事 Java部件 buflen=allocBuffer(1280,720); byte[] x= getBuffern(0,1280,720);//than i want to use this for addCallbackBuffer() freeBuffer(); NDK部件 signed char * yuvm; size_t

对于camera.addCallbackBuffer中的摄影机缓冲区,我想使用本机内存而不是Java堆

我写了一些代码,但它错了。我得到空数组

如何做好这件事

Java部件

buflen=allocBuffer(1280,720);
byte[] x= getBuffern(0,1280,720);//than i want to use this for addCallbackBuffer()
freeBuffer();
NDK部件

signed char * yuvm;


size_t getTotalSystemMemory()
{
    long pages = sysconf(_SC_PHYS_PAGES);
    long page_size = sysconf(_SC_PAGE_SIZE);
    return pages * page_size;
}


jint Java_com_example_testdvr_mycamview_allocBuffer(JNIEnv * env, jclass  obj, jint width, jint height){

    jint bufLength=getTotalSystemMemory()/4;
    bufLength=bufLength/(width*height*1.5);
    yuvm  = (signed char*) malloc (bufLength*width*height*1.5);
    return bufLength;
}

void Java_com_example_testdvr_mycamview_freeBuffer(JNIEnv * env, jclass  obj){

    if (sizeof(yuvm)!=0){
        free(yuvm);
    }
}

jbyteArray  Java_com_example_testdvr_mycamview_getBuffern(JNIEnv * env, jclass  obj, jint numbuf, jint width, jint height){

    jbyteArray res;

    env->SetByteArrayRegion(res,width*height*1.5*numbuf,width*height*1.5,yuvm);

    return res;

}
此外,我还想到使用NDK中的摄影机对象作为缓冲区的本机内存

像这样:

JNIEXPORT void JNICALL Java_com_test_jnicall_ld(
    JNIEnv *env,
    jclass clazs,
    jobject camera) {


    jclass clazz = env->GetObjectClass(camera);

    jmethodID voidVoidMethod = env->GetMethodID(clazz,"addCallbackBuffer", "([B)V");

    jbyteArray* b=malloc(640*480*3/2);
    env->CallVoidMethod(camera, voidVoidMethod,b);
}

但有一个问题:

09-18 13:24:22.982: W/dalvikvm(27090): Invalid indirect reference 0x783f8008 in decodeIndirectRef
09-18 13:24:22.982: E/dalvikvm(27090): VM aborting
09-18 13:24:22.982: A/libc(27090): Fatal signal 6 (SIGABRT) at 0x000069d2 (code=-6), thread 27123         (Thread-4070)

你能显示你看到的确切错误吗?任何日志cat消息?krsteeve,字节[]x=GetBufferN01280720;x=null