2011-05-16 44 views
1

事实上,我有这个工作,只是不正确。我有一个回调(发布在上一个问题:Unable to get JNIEnv* value in arbitrary context),它现在在Java层调用回调函数......唯一的问题是回调函数返回的数据类型。在我的Java代码中,在调试时,我发现回调传递给Java的类型的类型是class [B,而不是我期望的类型byte[]从JNI返回一个字节[]到Java

Java回调所做的唯一事情就是将其放置在队列中,但是当我需要处理该队列时会出现问题。

Java中的回调:

public void enqueueAudio(byte[] audioData){ 
    if(audioData != null){ 
     mWriteQueue.offer(audioData); 
    } 
} 

队列的处理:

private void writeToFile(String file){ 
    int totalNumOfBytes = 0; 
    byte[] dataFromQueue = new byte[0]; 
    byte[] temp; 
    for(byte[] data : mWriteQueue){ 
     temp = dataFromQueue; 
     dataFromQueue = new byte[temp.length + data.length]; 
     System.arraycopy(temp, 0, dataFromQueue, 0, temp.length); 
     System.arraycopy(data, 0, dataFromQueue, temp.length, data.length); 
     totalNumOfBytes += data.length; 
    } 
    // Write the total byte[] to the specified file. 
    mFileHandler.write(file, dataFromQueue); 
    updateUI("Number of bytes written to " + file + " : " + totalNumOfBytes + "\n"); 
} 

正如你所看到的,我认为队列充满byte[]的,而不是与class [B“ s,导致班级转换例外...

那么,是否正确,本机代码返回class [B而不是byte[]

为了完整起见,这里是在C方法:

void recorderCallback(SLAndroidSimpleBufferQueueItf bq, void *context){ 
    SLresult result; 
    JNIEnv* env; 
    jbyteArray data; 
    (*javaVM)->AttachCurrentThread(javaVM, &env, NULL); 
    if(env == NULL){ 
     LOG_ERROR("Could not get JNIEnv*"); 
     return; 
    } 
    data = (*env)->NewByteArray(env, MAX_PACKET_SIZE); 
    if(data == NULL){ 
     LOG_ERROR("No memory could be allocated for buffer"); 
     return; 
    } 
    (*env)->SetByteArrayRegion(env, data, 0, MAX_PACKET_SIZE, recorderBuffer); 
    (*env)->CallByteMethodA(env, javaObject, javaCallbackMID, data); 
    (*env)->DeleteLocalRef(env, data); 
    result = (*bq)->Enqueue(bq, recorderBuffer, 
          RECORDER_FRAMES * sizeof(jbyte)); 
    checkError(result, "Unable to enqueue new buffer"); 
    (*javaVM)->DetachCurrentThread(javaVM); 
} 
+0

为什么标记为C? – Lundin 2011-05-16 08:42:24

+0

对不起,我的错误xD不知道为什么我添加了该标记...它现在被删除... – ThaMe90 2011-05-16 08:46:11

回答

3

其实我有这个工作,只是没有 正确。

这是一个矛盾的词汇。

(*env)->CallByteMethodA(env, javaObject, javaCallbackMID, data); 

这不是一个ByteMethod。这是一个虚空方法。

+0

javaCallbackMID是enqueueAudio在Java中的方法ID,它是通过调用'javaCallbackMID =(* env)检索的 - > GetMethodID(env,javaClass,“enqueueAudio”,“([B)V”);'。我只用它来调用带有byte []参数的Java方法,这不是在调用它时传递给它的东西... – ThaMe90 2011-05-16 08:27:01

+0

哦,等等,我误读你的答案对不起... – ThaMe90 2011-05-16 08:27:34

+0

但是,这仍然没有' t解决问题...问题不是Java方法没有被调用,它被称为错误的参数类型... – ThaMe90 2011-05-16 08:28:31

相关问题