繁体   English   中英

C stdlib函数的Java等效项

[英]Java equivalents for C stdlib functions

我无法拿出更好的标题,所以在这里。 我试图找出从C的stdlib访问方法的最佳方法(在效率和代码明智的情况下)。为此的背景是,我试图在Java程序中获得mbstowcs的功能。 现在,在我的C代码中,我得到了:

const char* source = "D:\\test3\\source\\test.txt";
SName tmp1;
mbstowcs((wchar_t*)tmp1, source, 32 - 1);

其中SNametypedef unsigned short SName[32] 稍后在代码tmp1中将其用作输入参数:

status = copyFilePath(tmp1, tmp2, info, &context);

我本质上想做的是使用JNA从Java端调用此copyFilePath 诀窍是我需要在Java程序中获得与C的mbstowcs相似的转换,因此以后我可以直接调用此函数而无需任何其他处理。 就目前而言,在我看来,在使用JNI时我将需要其他C代码,以便可以从stdlib获取mbstowcs的包装。

问题还在于,是否有Java可以像在C / C ++中一样将Java的多字节字符串转换为宽字符字符串的类似方法?

不回答问题,而是尝试解决问题。 JNA具有com.sun.jna.WString 如果您调用带有WString参数的Function,它将在本机代码中显示为宽字符串。 您只需要确保您具有正确的编码即可。

代替function.invoke(myString); 这将在本地提供一个多字节字符串,只需使用function.invoke(new WString(myString));

将字节转换为文本的简单自然方法是使用字符串构造函数。 例如

Charset charset = Charset.forName("UTF-8"); // for example, or use one of
                                            // the predefined Charset constants in
                                            // java.nio.charset.StandardCharsets
byte[] bytes = ...
String text = new String(bytes, charset);

在Java中执行此类操作的有效方法是使用ByteBufferCharBuffer对象,而CharsetDecoder则从前者填充后者。

但是,如果您使用的是零终止的char*值,那么这些方法将行不通。 Java的标准API不支持零终止。 (Java数组具有明确定义的长度。)

我的建议是不要将代码直接从C / C ++转换为Java。 而是从头开始将其作为惯用的Java代码编写。 (如果您确实需要 C或C ++代码的效率,请使用这些语言!)

我本质上想做的是使用JNA从Java端调用此copyFilePath。 诀窍是我需要在Java程序中获得与C的mbstowcs相似的转换,因此以后我可以直接调用此函数而无需任何其他处理。

因此,简单的方法是:

  1. 在本机代码端转换为Java可以应付的东西(例如, byte[]String )。
  2. 通过JNA将byte[]String或其他内容传递给Java。
  3. 让Java端对其进行缓存,这样就无需重复JNA调用。

但是,值得注意的是Knuth关于过早优化的建议。 如果您经常越过Java /本机边界,以至于这种优化是值得的,则(IMO)应该重新考虑应用程序的更大设计;否则,您可能会遇到问题。 例如,为什么您的Java如此密集地调用本机代码(反之亦然)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM