2

我试图制作 c 中的 java 应用程序,源链接是http://phtranslator.sourceforge.net/我做了以下事情来调用那个 coe 但让它

public class Main {

/** Creates a new instance of Main */
public Main() {
}
public interface simpleDLL extends Library {
    simpleDLL INSTANCE = (simpleDLL) Native.loadLibrary(
        (Platform.isWindows() ? "C:\\translator\\PhTranslateLib.dll" : "simpleDLLLinuxPort"), simpleDLL.class);

    public   IntByReference  GetTeluguTranslator();
    public  int Translate(IntByReference Translator, String szInput,  StringBuilder szOutput, int nLen);
    public   int GetTranslatedBufferLength(IntByReference Translator,  String szInput, Pointer out);
    public  void  GetTranslatedBuffer(String szOutput, Pointer ppHint);
}

public static void main(String args[])
{     

    StringBuilder b =new StringBuilder();
      simpleDLL sdll = simpleDLL.INSTANCE;
      IntByReference  y = sdll.GetTeluguTranslator();
    int j=  sdll.Translate( y , "ananathapura", b, 0);

    System.out.println( b);

    System.out.println(j);




}

}

I am getting Following `Exception` 

Exception in thread "main" java.lang.IllegalArgumentException: Unsupported argument type java.lang.StringBuilder at parameter 2 of function Translate
    at com.sun.jna.Function.convertArgument(Function.java:552)
    at com.sun.jna.Function.invoke(Function.java:258)
    at com.sun.jna.Library$Handler.invoke(Library.java:216)
    at $Proxy0.Translate(Unknown Source)
    at anil.test.Main.main(Main.java:71)

String builder用字符串替换我得到了成功,但没有存储在string

4

1 回答 1

1

Translate方法接受返回缓冲区及其容量(nlen),因此其中将存储不超过 nlen 个字符(以确保防止字符串溢出)。

因此,在您的情况下,您要确保,

  1. Translate在调用之前为字符串缓冲区分配了足够的内存
  2. 您在调用中指定正确的缓冲区大小 - 这样缓冲区将被填充到该长度

例如,根据您的代码,您应该执行类似的操作

 // fill no more than 19 chars (+1 char for \0) in b
 int j=  sdll.Translate( y , "ananathapura", b, 20); 

这里 20 是一个粗略的猜测。如果您指定 20,请确保您的字符串b能够容纳 20 个宽字符(我希望 java 有一些预先分配字符串空间的方法)。由于在您的代码中您为 nLen 指定了 0,因此它没有存储任何内容。

现在,在生产中,您可能希望分配一个足够大的字符串以容纳所有转换后的 unicode 字符(而不是将其硬编码为 20)。

但是,你怎么知道转换后的字符串会有多大?这不像一个英文字符会被准确地翻译成一个泰卢固语或印地语字符。

这就是GetTranslatedBufferLength相关例程出现的地方。

有关该概念的更多详细信息,请参阅内联代码注释文档

希望这可以帮助。

于 2013-07-24T12:51:22.903 回答