2011-11-18 6 views
14

異なる理由により、JNIを使​​用してJavaでC#メソッドを直接呼び出すことはできません。最初に、C++のラッパーをC++で記述し、dllを作成してJNIを使​​ってJavaで使用する必要があります。Javaプログラム内でC#メソッドを呼び出す

C++でC#コードを呼び出す際に問題があります。 C#.netmoduleファイルをC++プロジェクトに追加します。下にコードが貼り付けられます。私が何か悪いことをしているなら、私を案内してください。

これは私の管理C++クラスUsbSerialNum.hです:私は.netmoduleファイルを作成しましたから

#using <mscorlib.dll> 
#include <iostream> 
#using "UsbSerialNumberCSharp.netmodule" 

using namespace std; 

using namespace System; 

public __gc class UsbSerialNum 
{ 
    public: 

     UsbSerialNumberCSharp::UsbSerialNumberCSharp __gc *t; 

     UsbSerialNum() { 
      cout<<"Hello from C++"; 
      t = new UsbSerialNumberCSharp::UsbSerialNumberCSharp(); 
     } 

     void CallUsbSerialNumberCSharpHello() { 
      t->hello(); 
     } 
}; 

C#UsbSerialNumberCSharp.csファイル:ここで

using System.Collections.Generic; 
using System.Text; 

namespace UsbSerialNumberCSharp 
{ 
    public class UsbSerialNumberCSharp 
    { 

     public UsbSerialNumberCSharp(){ 
      Console.WriteLine("hello"); 
     } 

     public static void hello() 
     { 
      Console.WriteLine("hello"); 
     } 

     public void helloCSharp() 
     { 
      Console.WriteLine("helloCSharp"); 
     } 
    } 
} 

makeDLL.dllが作成され、そこから私のメインmakeDLL.cppファイルです:

#include "jni.h" 
#include <iostream> 


// This is the java header created using the javah -jni command. 
#include "testDLL.h" 


// This is the Managed C++ header that contains the call to the C# 
#include "UsbSerialNum.h" 

using namespace std; 


JNIEXPORT void JNICALL Java_testDLL_hello 
(JNIEnv *, jobject) { 

    // Instantiate the MC++ class. 
    UsbSerialNum* serial = new UsbSerialNum(); 
    serial->CallUsbSerialNumberCSharpHello(); 
} 

は、ここに私のJavaクラスです:

public class testDLL { 

    static { 
     System.loadLibrary("makeDLL"); 
    } 

    /** 
    * @param args 
    */ 
    public static void main (String[] args) { 
     //  new testDLL().GetUSBDevices("SCR3", 100); 
     new testDLL().hello(); 
    } 

    public native void hello(); 

} 

EDIT:

私は単純に、すなわち私のメインのファイルにUsbSerial.hへの呼び出しを無視した場合はその後、私のコードは、Javaで正常に動作している++簡単なCを使用しています。基本的にC++管理クラスは正しく動作しません。 私を案内してください。ありがとう。

+0

ここでエラーが発生しますか? – Illuminati

+0

何が問題なのですか?これはC++で管理されていますか?私は '__gc'ビットを認識しません – flipchart

+0

私は質問を編集しました。チェックアウトしてください。ありがとう。 – HashimR

答えて

7

この相互運用性が必要なものを正確に知ることは有用です。いずれにしても、IKVMを調べる必要があります。あるいは、同様の問題のために提案されているように、COMをブリッジとして使用することができます.C#/ CLRをCOMインターフェイスとして公開し、Javaでcom4jを使用します。

+0

私はすべての接続されたUSBのシリアル番号を取得したい、すでにCでコードを書いて#、Javaで使用したい。 – HashimR

関連する問題