使用UnmanagedExports和JNA将字节数组从C#返回到Java

使用UnmanagedExports和JNA将字节数组从C#返回到Java,java,c#,bytearray,unmanaged,jna,Java,C#,Bytearray,Unmanaged,Jna,我最近发现了一个库,它允许我使用Java直接访问C方法 有人知道我试图将字节数组从C#返回到Java的错误是什么吗 以下是我的例子: C#代码: Java代码: package me.mt.test; import com.sun.jna.Library; import com.sun.jna.Native; import com.sun.jna.Platform; public class JnaTest { public interface JnaTestInterface extend

我最近发现了一个库,它允许我使用Java直接访问C方法

有人知道我试图将字节数组从C#返回到Java的错误是什么吗

以下是我的例子:

C#代码:

Java代码:

package me.mt.test;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
public class JnaTest {
  public interface JnaTestInterface extends Library{
      byte[] returnT1();
  }
  static JnaTestInterface jnaTest = null;

  static{       
        if(Platform.is64Bit()){
            jnaTest = (JnaTestInterface)Native.loadLibrary("JnaTestLibrary64", JnaTestInterface.class);
        }
        else{
            jnaTest = (JnaTestInterface)Native.loadLibrary("JnaTestLibrary86", JnaTestInterface.class);
        }
    }

  public byte[] returnT1(){
      return jnaTest.returnT1();
  }
}
package me.mt.test;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
import com.sun.jna.Pointer;
public class JnaTest {
  public interface JnaTestInterface extends Library{
      Pointer returnT1();
  }
  static JnaTestInterface jnaTest = null;

  static{       
        if(Platform.is64Bit()){
            jnaTest = (JnaTestInterface)Native.loadLibrary("JnaTestLibrary64", JnaTestInterface.class);
        }
        else{
            jnaTest = (JnaTestInterface)Native.loadLibrary("JnaTestLibrary86", JnaTestInterface.class);
        }
    }

  public byte[] returnT1(){
      Pointer p1 = jnaTest.returnT1();
      return p1.getByteArray(0, 5);
  }
}
Java异常:

Exception in thread "main" java.lang.IllegalArgumentException: Unsupported return type class [I in function returnT1

我用指针解决了这个问题

C#代码:

Java代码:

package me.mt.test;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
public class JnaTest {
  public interface JnaTestInterface extends Library{
      byte[] returnT1();
  }
  static JnaTestInterface jnaTest = null;

  static{       
        if(Platform.is64Bit()){
            jnaTest = (JnaTestInterface)Native.loadLibrary("JnaTestLibrary64", JnaTestInterface.class);
        }
        else{
            jnaTest = (JnaTestInterface)Native.loadLibrary("JnaTestLibrary86", JnaTestInterface.class);
        }
    }

  public byte[] returnT1(){
      return jnaTest.returnT1();
  }
}
package me.mt.test;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
import com.sun.jna.Pointer;
public class JnaTest {
  public interface JnaTestInterface extends Library{
      Pointer returnT1();
  }
  static JnaTestInterface jnaTest = null;

  static{       
        if(Platform.is64Bit()){
            jnaTest = (JnaTestInterface)Native.loadLibrary("JnaTestLibrary64", JnaTestInterface.class);
        }
        else{
            jnaTest = (JnaTestInterface)Native.loadLibrary("JnaTestLibrary86", JnaTestInterface.class);
        }
    }

  public byte[] returnT1(){
      Pointer p1 = jnaTest.returnT1();
      return p1.getByteArray(0, 5);
  }
}

我对jna了解不多,但我相信ByteBuffers(特别是直接变量)可以用于跨本机边界传递字节数组。我认为指向的数据可能会被
jnaTest.returnT1()
p1.getByteArray(0,5)之间的CLR垃圾收集所破坏
@TomBlodget
unsafe
关键字根本不会改变普通代码的语义。到目前为止,一切都很顺利。你靠的是运气。看这个。基本问题是内存所有权,以及所有权的转移(取决于技术)。将所有权返还给CLR后,您正在使用
fixed
语句范围之外的内存。