我有一個問題,這是可能的,以及如何?從C/C++中用Java創建的內存中的緩衝區中讀取字節?我的想法是使用JNI在C++中啓動一個循環,該循環將字節寫入緩衝區,並只將緩衝區的方向發送給Java,然後Java在另一個循環中從其讀取字節。目標是減少JNI函數的調用,因爲我注意到它們會降低性能。我想知道我必須在Java中使用哪些類以及C++中的函數。從C/C++在內存中寫入緩衝區,並在沒有JNI的java中讀取它
提前非常感謝你
我有一個問題,這是可能的,以及如何?從C/C++中用Java創建的內存中的緩衝區中讀取字節?我的想法是使用JNI在C++中啓動一個循環,該循環將字節寫入緩衝區,並只將緩衝區的方向發送給Java,然後Java在另一個循環中從其讀取字節。目標是減少JNI函數的調用,因爲我注意到它們會降低性能。我想知道我必須在Java中使用哪些類以及C++中的函數。從C/C++在內存中寫入緩衝區,並在沒有JNI的java中讀取它
提前非常感謝你
你可以使用ByteBuffer。最簡單的方法是使用由Java分配的地址的ByteBuffer.allocateDirect()
。如果您必須使用C提供的地址,則可以更改地址並限制(針對大小)以指向您喜歡的任何位置。
如果您寧願使用更低級別的東西,則可以在Oracle JVM上使用Unsafe.getXxxx(long address)
或Unsafe.setXxxx(long address, T value)
方法,但這些方法必須小心使用,因爲不正確的用法會導致JVM崩潰。 (就像在C中使用一個無效指針一樣)這些方法被ByteBuffer使用,並轉化爲一個優化的機器代碼指令。
然後我可以使用java在內存中分配一個地址,並用它在C中寫入該緩衝區?我感謝你的回答 –
你可以。這是最安全的方法。您可能需要設置字節順序爲默認大字節(但在x86/x64上它的小字節在C中)使用'ByteBuffer.order(ByteOrder.nativeOrder())',它在任何平臺上都是正確的。 –
感謝兄弟是正確的做法。 –