我有一些本機代碼返回一個jbyteArray(所以在Java端的byte []),我想返回null。然而,如果我只是返回0來代替jbyteArray,我會遇到問題。從本地方法返回null使用JNI
一些更多信息: 主要邏輯是在Java中,本地方法用於將一些數據編碼成字節流。不要問...它必須這樣做。最近,本地代碼不得不稍微修改一下,現在它的運行速度非常糟糕。經過一些實驗,包括在返回之前註釋掉本地方法中的所有代碼,結果返回0導致放緩。當返回一個實際的jbyteArray時,一切都很好。
我的代碼的方法簽名:
在C++方面:
extern "C" JNIEXPORT jbyteArray JNICALL Java_com_xxx_recode (JNIEnv* env, jclass java_this, jbyteArray origBytes, jobject message)
在Java方面:
private static native byte[] recode(byte[] origBytes, Message message);
本機代碼看起來是這樣的:
jbyteArray javaArray;
if (error != ERROR) {
// convert to jbyteArray
javaArray = env->NewByteArray((jsize) message.size);
env->SetByteArrayRegion(java_array, 0, message.size, reinterpret_cast<jbyte*>(message.buffer()));
if (env->ExceptionOccurred()) {
env->ExceptionDescribe();
error = ERROR;
}
}
if (error == ERROR) {
return 0; // Does NOT work - doesn't crash, just slows everything down horrible.
}
else {
return javaArray; // Works perfectly.
}
有沒有人知道這可能發生的任何原因?從本地方法代替jbyteArray返回NULL是否有效,或者是否有其他過程將null返回給Java。不幸的是,我沒有在Google上運氣。
謝謝!
編輯:增加了額外的信息。
爲什麼你返回0,而非陣列?爲什麼你不能簡單地返回一個空數組?請提供一些關於這個本地庫應該做什麼的更多細節。 – amischiefr 2009-07-22 17:46:41
你可以發佈一些代碼,至少是方法簽名等? – 2009-07-22 20:10:57
那麼,我特別希望Java接收「空」,而不是一個空字節數組。我可以重寫Java代碼來處理這個問題,但如果可能的話,我真的不想。我添加了方法簽名。 – Dan 2009-07-23 08:14:06