2016-09-29 3 views
1

В настоящее время я пытаюсь вызвать .NET-код с помощью jni4net.IncompatibleClassChangeError jni4net

Мне удалось создать прокси-классы из .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) 

Я сейчас workging с jdk1.7.0_75 64бит, Microsoft.NET \ Framework64 \ v4.0.30319 и jni4net-0,8. 6,0.

Класс AESObjectEnc C# для dll имеет метод шифрования, который ожидает String ref.

Заранее спасибо.

ответ

0

Вы не можете передать String методу C# Ref в DLL-файле, используя библиотеку jni. Если параметр ref является объектом Integer или простой C#, вы можете передать значение int или объект в файл C# .dll с помощью библиотеки jni.

Вы можете найти более подробную информацию от here.

Если вы хотите передать файл String в C# .dll, создайте новую функцию в DLL-файле, который принимает только String, а не Ref String. Затем вызовите эту функцию из вашего класса java с помощью jni-библиотеки. теперь вы можете передать значение String в код C#. И вызовите функцию Ref String из этой вновь созданной функции. Проверьте этот примерный код.

[JAVA CODE]

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; 
} 

Существующие Encrypt Метод

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

Это даст

OUTPUT
//To encrypt ok 
Смежные вопросы