我正試圖在我的Java項目中加載一個DLL,以允許我使用C#中的一些代碼。我做了一個樣本,並試圖實現它在我的Java項目,但我堅持收到以下錯誤,當我嘗試運行我的Java項目(設計師):我是收到使用JNI將C#加載到Java項目中的未解析鏈接錯誤
D:\RPMOpen\svnCobra\conversion\Designer>designer
D:\RPMOpen\svnCobra\conversion\Designer>java -jar Designer.jar "D:/RPMOpen/svnCobra"
Exception in thread "main" java.lang.UnsatisfiedLinkError: main/Designer.displayHeyLand()V
at main.Designer.main(Designer.java:491)
我感到好奇的是關於在我設法修復的Java項目中加載DLL的錯誤,以及在我的Java項目的以下代碼中,如果我註釋掉最後一行,我的Designer現在可以正常工作。這暗示我的.DLL實際上正在加載,但真正讓我感到困惑的是爲什麼我收到UnsatisfiedLinkError。
Java項目的示例代碼:
static {
System.load("D://RPMOpen/svnCobra/Java/Designer/HeyLand.dll");
}
public native void displayHeyLand();
public static void main(String[] args)
{
if (args.length == 0)
{
throw new IllegalArgumentException("Conversion location required");
}
cobraLocation = args[0];
INPUT = cobraLocation + "/conversion/src/vb/";
OUTPUT = cobraLocation + "/conversion/aui/Designer/";
//System.loadLibrary(cobraLocation + "/conversion/Designer/GetFRXWrapper.dll");
//String s = getFromFRX();
//System.out.println(s);
Designer t = new Designer();
t.displayHeyLand();
原始C#代碼試圖實現:
using System;
using System.Windows.Forms;
public class CSharpHeyLand
{
public CSharpHeyLand() { }
public void displayHeyLand()
{
MessageBox.Show("Hey Java, this is C#!", "Sample");
}
}
元素從我的包裝,包括一個C++源文件和兩個頭文件的:
//Cpp file HeyLand.cpp *******************************************
#include <jni.h>
#include "Java\HeyWork.h"
// managed c++ header containing call to c#
#include "MCPP\HeyLand.h"
// JNI call to managed C++ Class
JNIEXPORT void JNICALL Java_Main_Designer_displayHeyLand (JNIEnv *jn, jobject jobj) {
// istantiate the MC++ class.
HeyLandC* t = new HeyLandC();
// actual call is made.
t->callCSharpHeyLand();
}
//Header file HeyWork.h *******************************************
#include <jni.h>
/* Header for class Test1 */
#ifndef _Included_Designer
#define _Included_Designer
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: Designer
* Method: displayHeyLand
* Signature: (Ljava/lang/String;)V
*/
JNIEXPORT void JNICALL Java_Main_Designer_displayHeyLand
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
//Header file HeyLand.h *******************************************
#using <mscorlib.dll>
#using "/CSharpHeyLand.netmodule"
using namespace System;
public __gc class HeyLandC
{
public:
// provide .NET interop and garbage collecting to the pointer
CSharpHeyLand __gc *t;
HeyLandC() {
t = new CSharpHeyLand();
// Assign the reference a new instance of the object
}
// This inline function is called from the C++ Code
void callCSharpHeyLand() {
t->displayHeyLand();
}
};
任何幫助,非常感謝!
我想我昨天看到了同樣的問題,你是否嘗試刪除「MessageBox.Show」句子,看看它是否可以? – Matt
它仍然不好,昨天在我的大型項目中沒有實施的樣本在消息框中運行。 – HavelTheGreat
嘗試使用進程監視器來監視java.exe以查看它如何加載DLL:https://technet.microsoft.com/en-us/sysinternals/bb896645。 – Matt