簡體   English   中英

無法使用jna從Java調用.net方法?

[英]Unable to call .net method From java using jna?

我試圖制作c語言中的java應用程序,源鏈接為http://phtranslator.sourceforge.net/我做了以下事情來調用該代碼,但使其成功

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

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和相關例程的體現。

有關該概念的更多詳細信息,請參見內聯代碼注釋文檔

希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM