2011-05-16 121 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