1

我想使用本机内存而不是 Java 堆作为 camera.addCallbackBuffer(); 中的相机缓冲区。

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

如何正确地做到这一点?

爪哇部分

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)
4

0 回答 0