2013-07-24 47 views
2

我试图使这是在C Java应用程序,链接源是http://phtranslator.sourceforge.net/我做下面的事情来调用COE但要无法调用.net方法从java使用jna?

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

+0

什么都不是,甚至你的名字也没有问题,它必须转换为telugu,当使用字符串时,我得到了该缓冲区的长度,但无法获得该字符串 – AnilHoney

+1

看起来像字符串必须通过而不是“StringBuffer”in翻译功能。你尝试使用“字符串” – Reddy

+0

你确定'Translate'采用字符串吗? –

回答

1

Translate方法接受返回缓冲区及其容量(nlen),以便不再n 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是一个粗略的猜测。确保你的字符串b能够保存20个宽字符,如果你指定了20(我希望java有一些预先分配字符串空间的方法)。由于在你的代码中你为nLen指定了0,所以它没有存储任何东西。

现在,在生产中,您可能需要分配一个足够大的字符串来存放所有转换后的Unicode字符(而不是将其硬编码为20)。

但是,您如何知道转换后的字符串有多大?这不像一个英文字符将完全翻译成一个泰卢固语或印地文字符。

这是GetTranslatedBufferLength和相关例程进入图片的地方。

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

希望这会有所帮助。

+0

现在使用字符串的所有问题只是放置字符[]它工作得很好,谢谢 – AnilHoney