使用UnmanagedExports和JNA将字节数组从C#返回到Java
我最近发现了一个库,它允许我使用Java直接访问C方法 有人知道我试图将字节数组从C#返回到Java的错误是什么吗 以下是我的例子: 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
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垃圾收集所破坏
@TomBlodgetunsafe
关键字根本不会改变普通代码的语义。到目前为止,一切都很顺利。你靠的是运气。看这个。基本问题是内存所有权,以及所有权的转移(取决于技术)。将所有权返还给CLR后,您正在使用fixed
语句范围之外的内存。