2016-09-29 55 views
1

我目前正在嘗試使用jni4net調用.NET代碼。IncompatibleClassChangeError jni4net

我已經設法使用proxygen從.NET .dll創建代理類。然而,這段代碼:

Bridge.init(); 
Bridge.LoadAndRegisterAssemblyFrom(new File("clAESEncripcion.j4n.dll")); 
aesencryption.AESObjectEnc aesObjectEnc = new aesencryption.AESObjectEnc(); 
aesObjectEnc.Encrypt(new Ref<String>("To encrypt")); 

拋出以下異常:

Exception in thread "main" java.lang.IncompatibleClassChangeError 
    at aesencryption.AESObjectEnc.Encrypt(Native Method) 
    at clAESEncripcion.MainApp.main(MainApp.java:19) 
    at net.sf.jni4net.jni.JNIEnv.ExceptionTest()(:0) 
    at net.sf.jni4net.jni.JNIEnv.CallIntMethod()(:0) 
    at net.sf.jni4net.inj.__IClrProxy.getClrHandle()(:0) 
    at net.sf.jni4net.inj.__IClrProxy.GetObject()(:0) 
    at net.sf.jni4net.utils.Convertor.StrongJp2CString()(:0) 
    at net.sf.jni4net.utils.Convertor.FullJ2C()(:0) 
    at net.sf.jni4net.Ref.GetValue()(:0) 
    at AESEncryption.__AESObjectEnc.Encrypt1()(:0) 

我目前正在jdk1.7.0_75 64位,Microsoft.NET \ Framework64 \ v4.0.30319和jni4net-0.8 workging。 6.0。

dll的AESObjectEnc C#類有一個Encrypt方法,期望String ref。

在此先感謝。

回答

0

您不能使用jni庫將String傳遞給.dll文件中的c#Ref方法。如果ref參數是Integer或簡單的c#對象,則可以使用jni庫將int值或對象傳遞給C#.dll文件。

您可以從here找到更多詳細信息。

如果要將字符串傳遞給c#.dll文件,請在.dll文件中創建只接受字符串而不接受引用字符串的新函數。然後使用jni庫從你的java類調用該函數。現在您可以將String值傳遞給C#代碼。並從該新創建的函數中調用Ref String函數。看看這個示例代碼。

[Java代碼]

Bridge.init(); 
Bridge.LoadAndRegisterAssemblyFrom(new File("clAESEncripcion.j4n.dll")); 
aesencryption.AESObjectEnc aesObjectEnc = new aesencryption.AESObjectEnc(); 

public void javaMethod(){ 
    String val = "To encrypt"; 
    String receive_val = ""; 
    receive_val = aesObjectEnc.CallEncrypt(val); 
    System.out.println(receive_val); 
} 

[C#CODE]

新方法

public String CallEncrypt(String val){ 

    String send_val = val; 
//Call Encrypt Method 
    Encrypt(ref send_val); 

//Get Value 
    String output = send_val; 
//Pass value to Java Class 
    return output; 
} 

現有加密方法

public String Encrypt(ref String receive_val){ 
    receive_val = receive_val + " ok"; 
} 

這會給輸出

//To encrypt ok 
相關問題