java - jni4net 不兼容的类更改错误

标签 java c# .net java-native-interface jni4net

我目前正在尝试使用 jni4net 调用 .NET 代码。

我已成功使用 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.6.0。

DLL 的 AESObjectEnc C# 类有一个需要字符串引用的 Encrypt 方法。

提前致谢。

最佳答案

您无法使用 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# 代码]

新方法

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

关于java - jni4net 不兼容的类更改错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39777596/

相关文章:

java - JOrbis无法从JAR读取ogg文件

java - 单击时尝试更改 JButton 上的图标

java - 如何使用 while 循环找到最大变量?

java - Groovy 更新导致 PermGen 中大量死亡 GroovyClassLoader

c# - Visual Studio 找不到我引用的 DLL 的命名空间

c# - 泛型和从不同类调用重载方法 - 优先级问题

.net - 使用 .NET 根据模式验证 XML

c# - 在不调用 getter 的情况下读取属性的属性?

.net - MS 考试 70-536 - 如何从线程中抛出和处理异常?

.net - System.Diagnostics.Contracts 的有用性