我正在設計一個JNI接口,將字符串參數從Java傳遞給C++。我需要高性能,並且能夠使用Direct ByteBuffer和String.getBytes()很好地完成這項工作,但將字符串傳遞給C/C++的代價仍然相當高。我最近閱讀了關於Open JDK的Unsafe類。 This excellent page讓我開始了,但我發現不安全是可悲的,但可以理解的是記錄不完善。固定不安全的指針
我想知道,如果我使用不安全類獲取指向字符串的指針並將其傳遞給C++,那麼在輸入C++代碼之前是否存在該對象已移動的風險?即使在C++正在執行?還是由不安全代碼提供的這些地址固定?如果他們不固定,這些不安全指針如何有用?
如果您發佈了一些代碼,它將有很大的幫助。特別是,它將有助於瞭解C++代碼是否從Java位同步調用,或者是否有多個線程。另外,通過指向字符串的指針是指'char *'還是'std :: string *'?用代碼回答很多! – Luis 2014-09-12 19:43:29
看來懲罰是從UTF-16轉換爲你的C++代碼使用的任何編碼。如果您的C++代碼可以處理已計數(未終止)的UTF-16,則不需要使用'GetStringChars'和'GetStringLength'進行轉換或複製。這不是你所說的「指向一個字符串的指針?」 – 2014-09-13 21:44:03
湯姆。即使你對它沒有做任何事情,從Java-> JNI-> C++傳遞一個對象(包括字符串)似乎會有性能損失。這個成本明顯高於通過很長時間的成本。我不確定這個成本是否僅僅是因爲創造了一個隱含的本地參考。不管什麼原因,這個代價是痛苦的。另外GetStringChars也有一個可以衡量的成本。我想我讀過那是因爲有人收到一個指向字節COPY的指針......或者該對象必須被固定。無論哪種方式,你可以想象,造成延遲。 – user3624334 2014-09-16 18:40:51