由於不同的原因,不能使用JNI直接在Java中調用C#方法。所以首先,我們必須使用C++爲C#編寫包裝器,然後創建dll並通過Java中的JNI使用它。在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.cpp
文件從makeDLL.dll
創建:
#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();
}
編輯:
如果我根本不理會調用UsbSerial.h在我的主文件即使用簡單的C++,然後我的代碼是用Java工作的罰款。基本上C++託管類不能正常工作。 請指導我。謝謝。
在哪一點您會收到錯誤? – Illuminati
問題是什麼?這是託管的C++嗎?我不認識我編輯過這個問題的'__gc'位 – flipchart
。請檢查一下。謝謝。 – HashimR