C stdlib函数的Java等价物

C stdlib函数的Java等价物,java,c,java-native-interface,jna,Java,C,Java Native Interface,Jna,我想不出更好的标题了,就在这里。我试图找出从C的stdlib访问方法的最佳方式(在效率和干净的代码方面)是什么。现在在我的C代码中,我得到了: const char* source = "D:\\test3\\source\\test.txt"; SName tmp1; mbstowcs((wchar_t*)tmp1, source, 32 - 1); 其中SName是typedef无符号短SName[32]。后面的代码tmp1将用作输入参数: status = copyFilePath(tm

我想不出更好的标题了,就在这里。我试图找出从C的stdlib访问方法的最佳方式(在效率和干净的代码方面)是什么。现在在我的C代码中,我得到了:

const char* source = "D:\\test3\\source\\test.txt";
SName tmp1;
mbstowcs((wchar_t*)tmp1, source, 32 - 1);
其中
SName
typedef无符号短SName[32]
。后面的代码
tmp1
将用作输入参数:

status = copyFilePath(tmp1, tmp2, info, &context);
我基本上是想使用JNA从Java端调用这个
copyFilePath
。诀窍是,我需要在Java程序中获得与C的mbstowcs类似的转换,以便稍后可以直接调用此函数,而无需任何额外处理。现在,在我看来,我在使用JNI时需要额外的C代码,这样我就可以从stdlib获得mbstowcs的包装器


还有一个问题是,Java有没有类似的方法将多字节字符串转换为宽字符串,就像在C/C++中一样,以实现所有功能?

将字节转换为文本的简单自然方法是使用字符串构造函数;e、 g

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将
    字节[]
    字符串
    或任何内容传递给Java
  • 让Java端缓存它,这样JNA调用就不需要重复了

  • 但值得注意的是Knuth关于过早优化的建议。如果您经常跨越Java/本机边界,这种优化是值得的,那么您应该(IMO)重新考虑应用程序的更大设计;e、 为什么Java如此频繁地调用本机代码(反之亦然)。

    将字节转换为文本的简单自然方法是使用字符串构造函数;e、 g

    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将
    字节[]
    字符串
    或任何内容传递给Java
  • 让Java端缓存它,这样JNA调用就不需要重复了

  • 但值得注意的是Knuth关于过早优化的建议。如果您经常跨越Java/本机边界,这种优化是值得的,那么您应该(IMO)重新考虑应用程序的更大设计;e、 g.为什么Java如此频繁地调用本机代码(反之亦然)。

    没有回答这个问题,而是试图帮助解决这个问题。JNA拥有
    com.sun.JNA.WString
    。如果使用WString参数调用函数,它将在本机代码中显示为宽字符串。您只需确保编码正确即可


    而不是
    function.invoke(myString)在本机端提供一个多字节字符串,只需使用
    function.invoke(newwstring(myString))

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


    而不是
    function.invoke(myString)在本机端提供一个多字节字符串,只需使用
    function.invoke(newwstring(myString))

    如果我理解正确,所有Java
    char
    s和
    Strings
    都已经是宽(16位)字符了。这就是你想要的吗?Java
    File
    类处理所有的翻译,我从来没有遇到过路径名的问题。如果你想要文件内容,那就不同了。您希望文件采用什么编码?如果我理解正确,所有Java
    char
    s和
    Strings
    都已经是宽(16位)字符。这就是你想要的吗?Java
    File
    类处理所有的翻译,我从来没有遇到过路径名的问题。如果你想要文件内容,那就不同了