加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 22:10:26 所属栏目:百科 来源:网络整理
导读:我最近发现库 UnmanagedExports 允许我使用 JNA直接从Java访问C#-methods. 有没有人知道我尝试将字节数组从C#返回给Java有什么问题? 这是我的例子: C#代码: using System;using RGiesecke.DllExport;namespace JnaTestLibrary{ public class JnaTest { [D
我最近发现库 UnmanagedExports 允许我使用 JNA直接从Java访问C#-methods.

有没有人知道我尝试将字节数组从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,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);
        }
    }

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读