事實上,我有這個工作,只是不正確。我有一個回調(發佈在上一個問題: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);
}
爲什麼標記爲C? – Lundin 2011-05-16 08:42:24
對不起,我的錯誤xD不知道爲什麼我添加了該標記...它現在被刪除... – ThaMe90 2011-05-16 08:46:11