首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用UnmanagedExports和JNA将字节数组从C#返回给Java

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

Stack Overflow用户
提问于 2014-12-31 05:03:09
回答 1查看 832关注 0票数 4

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

下面是我的例子:

C#代码:

代码语言:javascript
运行
复制
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代码:

代码语言:javascript
运行
复制
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异常:

代码语言:javascript
运行
复制
Exception in thread "main" java.lang.IllegalArgumentException: Unsupported return type class [I in function returnT1
EN

回答 1

Stack Overflow用户

发布于 2014-12-31 19:12:27

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

C#代码:

代码语言:javascript
运行
复制
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代码:

代码语言:javascript
运行
复制
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);
  }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27712515

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档