【问题标题】:IncompatibleClassChangeError jni4net不兼容的ClassChangeError jni4net
【发布时间】:2016-09-29 18:34:01
【问题描述】:

我目前正在尝试使用 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 64bits 、Microsoft.NET\Framework64\v4.0.30319 和 jni4net-0.8.6.0。

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

提前致谢。

【问题讨论】:

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


    【解决方案1】:

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

    您可以在here找到更多详细信息。

    如果要将字符串传递给 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-20
      • 1970-01-01
      • 1970-01-01
      • 2014-04-12
      • 1970-01-01
      • 1970-01-01
      • 2018-07-04
      • 1970-01-01
      相关资源
      最近更新 更多