无法调用.net方法从java使用jna?

时间:2013-07-24 10:26:51

标签: java jna

我试图制作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

1 个答案:

答案 0 :(得分:1)

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

所以,在你的情况下,你想确保,

  1. Translate调用
  2. 之前,为字符串缓冲区分配了足够的内存
  3. 您在调用中指定了正确的缓冲区大小 - 以便缓冲区将被填充到该长度
  4. 例如,根据您的代码,您应该执行类似

    的操作
     // 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和相关例程的情况。

    有关该概念的更多详细信息,请参阅内联code commentsdocumentation

    希望这有帮助。