2011-09-04 18 views
0

私は可能な重複を参照してこの問題を解決しようとしましたが、どれも役立たないようです。"native"を使用したJavaでのWindows API呼び出しの使用

私は現在のWindowsユーザー名とネイティブWindows MessageBoxを取得するためにJavaのWin APIメソッドを呼び出すために使用しているコードですが、私のコードでnativeメソッドを見つけることができないことを示すUnsatisfiedLinkError私は電話しようとしている。

public class TestNative 
{ 
    public static void main(String[] args) 
    { 
     long[] buffer= { 128 }; 
     StringBuffer username = new StringBuffer((int)buffer[0]); 
     GetUserNameA(username,buffer); 
     System.out.println("Current User : "+username); 
     MessageBoxA(0,"UserName : "+username,"Box from Java",0); 
    } 
    /** @dll.import("ADVAPI32") */ 
    static native void GetUserNameA(StringBuffer username,long[] buffer); 
    /** @dll.import("USER32") */ 
    private static native int MessageBoxA(int h,String txt,String title,int style); 
} 

JavaのネイティブWindowsメソッドを呼び出す方法は、(比較的単純な)可能性があります。私はそれがJavaがクロスプラットフォーム言語であるというまさにその理由を打ち砕くだろうが、私はWindowsでJavaで開発するプロジェクトに取り組む必要がある。

ありがとうございました。

アップデートは

デビッドHeffernanのが示唆したように、私はMessageBoxAMessageBoxのメソッドシグネチャを変更しようとしましたが、まだそれは働いていません。

答えて

2

私はそれが完全に一致しない署名に関連していると思います。

GetUserName関数は、LPTSTRとLPDWORDの2つのパラメータをとります。 JavaはTCHAR配列として動作するStringBufferを処理しない可能性があります。

また、Windows APIを使用するのはなぜですか? Javaはおそらくユーザーのログオン名を得ることができます(高速googleはSystem.getProperty( "user.name"))、そしてSwingはメッセージボックスを作成することができます(Windowsのように見えます)。

+0

まあ、私が開発しようとしているアプリケーションの目的ではないのですが、これは上記の方法で 'native'を使ってAPI関数を呼び出すことができるかどうかをテストすることです。 – Kushal

+0

ああ、私はそれがあなたの最終目標であると仮定してはいけません。私はまだ正確に一致しない署名が問題であると疑う。私の興味は今盛り込まれているので、私はそれを試しに行くつもりです。 – Corbin

+0

新しい機能でなければ、ラッピングコードを書く必要があると思われます。 JNIの動作を調べた後、ライブラリにJava対応のコードがなくてもDLL内の関数を直接呼び出す方法はないと思います。 – Corbin

0

DLLのパスに-Djava.library.path VM argが設定されていますか?あるいは、システムのPATHに格納することもできます。

0

エラーは、MessageBoxが存在しないためです。あなたはおそらくMessageBoxAを意味します。

+0

メソッドシグニチャを 'MessageBoxA'に変更しようとしましたが、同じエラーが発生しました。 – Kushal

1

https://github.com/twall/jnaを試しましたか?私は良いことを聞いたことがあり、多くの利便性と簡素化を伴ってより簡単にjniを作ることになっています。