我试图制作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
答案 0 :(得分:1)
Translate
方法接受返回缓冲区及其容量(nlen),以便在其中存储不超过nlen个字符(以确保防止字符串溢出)。
所以,在你的情况下,你想确保,
Translate
调用例如,根据您的代码,您应该执行类似
的操作 // 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 comments和documentation。
希望这有帮助。