我正在设计一个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