2011-12-30 15 views
6

私はC#で書かれたjavaのdllメソッドにアクセスしようとしています。次のコードから、正常に生成されたDLLをビルドしようとしています。javaのdllメソッドへのアクセス

using System; 
using Microsoft.Win32; 


namespace CyberoamWinHelper 
{ 
    public class RegistryAccess 
    {   
     public static String getValue(String key) 
     { 
      RegistryKey rk = Registry.CurrentUser; 
      RegistryKey rk1=rk.OpenSubKey("Software\\Test", RegistryKeyPermissionCheck.ReadWriteSubTree, System.Security.AccessControl.RegistryRights.FullControl); 
      rk1.SetValue(key, "val1"); 
      return rk1.GetValue(key).ToString(); 
     } 
     public static void createSubkey(String name) 
     { 
      RegistryKey rk = Registry.CurrentUser; 
      rk.CreateSubKey("Software\\Test"); 
     } 
    } 
} 

この後、私はそれは私に次のエラーを与えているこのコードを実行した後

public class JNI { 

    /** 
    * @param args the command line arguments 
    */ 
    public native String getValue(String key);  

    public static void main(String[] args) { 
     // TODO code application logic here 

     try 
     { 
      System.loadLibrary("CyberoamWinHelper"); 
      JNI j=new JNI();  
      System.out.println(j.getValue("abc")); 
     } 
     catch(UnsatisfiedLinkError e) 
     { 
      System.out.println("Ex" + e.getMessage()); 
     } 
    } 
} 

を次のようにしているの私のJavaプログラムのコードで生成されたDLLをロードしています。

"Exjni.JNI.getValue(Ljava/lang/String;)Ljava/lang/String;" 

このエラーの内容を理解していませんが、解決したいと思います。 もう1つの質問は私が持っている方法は私が呼び出しているので静的メソッドは、このように呼び出されますか?私たちはので、ここで「classname.methodname」

メソッドを呼び出すことができるようになります

を必要とする静的メソッドを呼び出すために意味ですか?

+0

あなたはSystem.loadLibraryを('であなたのネイティブライブラリをロードするために必要な特定のためのhttp://www.codeproject.com/KB/cross-platform/javacsharp.aspx - 好ましくは静的初期化子 – fge

+0

@fgeに:

はを見てください、私はそれをやった 。それはうまくいかなかった。 – ankurtr

+0

もちろん、.NET DLLは標準DLLではなく、それ自体がJNIで動作しません。 –

答えて

7

これらのメソッドが実際にこのように呼び出されるように設計されている場合は、JNI経由でのみメソッドを呼び出すことができます。あなたの方法は絶対にそうではありません。あなたがここでやっていることは、(あまりにも鈍い)申し訳ありませんが、これまで成功する機会は全くありません。単にこのようには機能しません。

進めていく方法はいくつかあります。 JNIについて学ぶことと、JNIで実際に動作するライブラリを書く方法があります。 Hereは、このための標準的なリファレンスです。 C#でこれを行うと、さらに複雑なレイヤーが追加されます。

もう1つの方法は、JNIをあきらめて、メソッドにアクセスするためのより適切なメカニズムを使用することです。 JNAについてはこちらをご覧ください。それはあなたの目標に完全に適しています。

+1

@ ankur-trapasiya - Ernest Friedman-Hillの提案は絶対に正しいです!彼に聞いてください! – paulsm4

+0

@ paulsm4:私はJNAでそれをしようとしています。 – ankurtr

0

あなたのJNIの使用は間違っています。 C#ライブラリでJNIを使​​用するのは難しいことではありませんが、難しいことです。それについて行くための優れたチュートリアルがありますhere。 GoogleでC#JNI検索を行うと、より多くの情報が表示されます。

また

EDIT

http://caffeine.berlios.de/site/documentation/quickstart.html

がクールなソリューションです。.. Grasshopperのようなものを調査する必要があります。

+0

最初のリンクは、私がやろうとしていることではありません。それはVisual C++とJavaについてです。それはJNIを通して行われますが、私はJNIの有無にかかわらず、C#とJavaの間でやりたいと思います。そして、第二のリンクにも私の質問に答えがありません。 – ankurtr

+1

JNIにはC#との直接インタフェースはありません。C#とJavaの間にC++スタブを作成する必要があります。 –

+0

OOooh私はあなたのためのクールなソリューションを見つけた。 jani4netはJayanの指定どおりですが、... –

0

参考サイト:http://www.sahirshah.com/java/jni.html

試してみてください。

public class myJNI { 

/** 
* @param args the command line arguments 
*/ 
public static native String getValue(String key);  
static 
{ 
    System.loadLibrary("CyberoamWinHelper"); 
} 
public static void main(String[] args) { 
    // TODO code application logic here 

    try 
    {  
     String myKey = "abc"; 
     System.out.println(getValue(myKey)); 
    } 
    catch(UnsatisfiedLinkError e) 
    { 
     System.out.println("Ex" + e.getMessage()); 
    } 
    } 
} 

あなたは上記のリンクで説明したように、C++のDLLにDLLをラップする必要があります。単に "javah -jni myJNI"コマンドでヘッダファイルを生成し、そのヘッダファイルにある関数シグニチャを持つC++ dllをビルドしてください。`)「Hello World」のC#での例では、

関連する問題