IncompatibleClassChangeError jni4net
IncompatibleClassChangeError jni4net
我目前正在尝试使用 jni4net 调用 .NET 代码。
我已经成功地使用 proxygen 从 .NET .dll 创建了代理 classes。但是,这段代码:
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.6.0.
dll 的 AESObjectEnc C# class 有一个需要字符串引用的加密方法。
提前致谢。
您不能使用 jni 库将字符串传递给 .dll 文件中的 c# Ref 方法。如果 ref 参数是整数或简单的 c# 对象,您可以使用 jni 库将 int 值或对象传递给 C# .dll 文件。
您可以从 here 中找到更多详细信息。
如果要将字符串传递给 c# .dll 文件,请在 .dll 文件中创建一个只接受字符串而不接受引用字符串的新函数。然后使用 jni 库从 java class 调用该函数。现在您可以将字符串值传递给 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
我目前正在尝试使用 jni4net 调用 .NET 代码。
我已经成功地使用 proxygen 从 .NET .dll 创建了代理 classes。但是,这段代码:
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.6.0.
dll 的 AESObjectEnc C# class 有一个需要字符串引用的加密方法。
提前致谢。
您不能使用 jni 库将字符串传递给 .dll 文件中的 c# Ref 方法。如果 ref 参数是整数或简单的 c# 对象,您可以使用 jni 库将 int 值或对象传递给 C# .dll 文件。
您可以从 here 中找到更多详细信息。
如果要将字符串传递给 c# .dll 文件,请在 .dll 文件中创建一个只接受字符串而不接受引用字符串的新函数。然后使用 jni 库从 java class 调用该函数。现在您可以将字符串值传递给 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