C stdlib函数的Java等价物
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C stdlib函数的Java等价物相关的知识,希望对你有一定的参考价值。
我无法想出更好的头衔,所以在这里。我试图找出从C的stdlib访问方法的最佳方法(在效率和清晰代码方面)最好的方法。背景是我试图在Java程序中获得mbstowcs的功能。现在在我的C代码中我得到了这个:
const char* source = "D:\test3\source\test.txt";
SName tmp1;
mbstowcs((wchar_t*)tmp1, source, 32 - 1);
SName
是typedef unsigned short SName[32]
。稍后在代码中,tmp1
被用作输入参数:
status = copyFilePath(tmp1, tmp2, info, &context);
我本来想要做的是使用JNA从Java端调用这个copyFilePath
。诀窍是我需要在Java程序中获得与C的mbstowcs类似的转换,所以稍后我可以直接调用此函数而无需任何额外的处理。目前我觉得在使用JNI时我需要额外的C代码,所以我可以从stdlib获得mbstowcs的包装器。
问题还在于,是否有类似的方法让Java将多字节字符串转换为宽字符串,就像在C / C ++中一样,以使其全部运行?
没有回答问题,而是试图帮助解决问题。 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中执行此类操作的有效方法是使用ByteBuffer
和CharBuffer
对象,并使用CharsetDecoder
顶部填充后者。
但是这些方法无法使用零终止的char*
值。 Java的标准API不支持零终止。 (Java数组具有明确定义的长度。)
我的建议是不要将代码从C / C ++直接转换为Java。相反,从头开始编写它作为惯用的Java代码。 (如果你真的需要C或C ++代码的效率,请使用这些语言!)
我本来要做的是使用JNA从Java端调用这个copyFilePath。诀窍是我需要在Java程序中获得与C的mbstowcs类似的转换,所以稍后我可以直接调用此函数而无需任何额外的处理。
所以简单的方法是:
- 在本机代码端转换为Java可以处理的东西(例如
byte[]
或String
)。 - 通过JNA将
byte[]
或String
或其他任何内容传递给Java。 - 让Java端缓存它,以便不需要重复JNA调用。
但值得注意的是Knuth关于过早优化的建议。如果您经常跨越Java /本地边界以至于这种优化是值得的,那么您应该(IMO)重新考虑应用程序的更大设计;例如为什么你的Java如此密集地调用本机代码(反之亦然)。
以上是关于C stdlib函数的Java等价物的主要内容,如果未能解决你的问题,请参考以下文章