IncompatibleClassChangeError jni4net

本文关键字:jni4net IncompatibleClassChangeError | 更新日期: 2023-09-27 18:09:45

我正在尝试使用jni4net调用。net代码。

我已经设法创建代理类从. net .dll使用proxygen。但是,这段代码:

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 64bits, microt.net 'Framework64'v4.0.30319和jni4net-0.8.6.0。

dll的AESObjectEnc c#类有一个Encrypt方法,它需要一个String ref.

提前感谢。

IncompatibleClassChangeError jni4net

不能使用jni库将String传递给.dll文件中的c# Ref方法。如果ref parameter是一个Integer或简单的c#对象,你可以使用jni库将int值或对象传递给c# .dll文件。

你可以在这里找到更多的细节。

如果你想传递一个String给c# .dll文件,在.dll文件中创建一个只接受String而不接受Ref String的新函数。然后使用jni库从java类调用该函数。现在你可以将字符串值传递给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#代码)

新方法
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