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

标签 java c# bytearray unmanaged jna

我最近找到了图书馆UnmanagedExports 这让我可以使用 JNA 直接从 Java 访问 C# 方法.

有人知道我尝试将字节数组从 C# 返回到 Java 有什么问题吗?

这是我的例子:

C#代码:

using System;
using RGiesecke.DllExport;
namespace JnaTestLibrary
{
  public class JnaTest
  {
    [DllExport]
    public static byte[] returnT1()
    {
        byte[] t1 = {1,2,3,4,5};
        return t1;
    }
  }
}

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

Java 异常:

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

最佳答案

我用指针解决了这个问题。

C#代码:

using System;
using RGiesecke.DllExport;
namespace JnaTestLibrary
{
  public class JnaTest
  {
    [DllExport]
    public unsafe static byte* returnT1()
    {
        byte[] t1 = {1,2,3,4,5};
        fixed (byte* p1 = t1)
        {
          return p1;
        }
    }
  }
}

Java代码:

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 - 使用 UnmanagedExports 和 JNA 将字节数组从 C# 返回到 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27712515/

相关文章:

c# - 在立即窗口中执行不带参数的方法

java - 使用 SharedPreferences 保存字节数组

c# - 将 int 复制到 byte[] 的最简单方法

java - JSON值类型是否需要严格定义?

java - 如何从 Multimap 的字符串表示中删除第一个和最后一个字符?

java - 在 Java 中比较两组的最快方法是什么?

c# - 从两个不同的输入上传两个不同的文件

java - 为什么jsp在将Jsp转换为Servlet时创建PageContext和JspWriter的两个引用

c# - 在文本 block 中的文本上添加阴影

bytearray - Kafka 字节数组