gpt4 book ai didi

java - JNA 是否允许通过引用或值将二维数组传递给 C?

转载 作者:行者123 更新时间:2023-11-30 15:25:41 27 4
gpt4 key购买 nike

我有一个 Java Web 应用程序,其中一个类中有一个方法,该方法查找数组的重复行,删除它们,然后将总行数传递回调用程序。部署应用程序时,此方法最多需要 50 秒才能执行。我想看看使用 C 语言是否会大大加快速度。我想知道使用 native C 代码的 JNA 是否允许将二维整数数组(通过引用或值引用会更好,因为 Web 应用程序需要更新的数组)传递给 native C 库方法(我在 Linux 上)因为我的应用程序的网络托管是 Linux)。任何帮助、见解、评论、建议、示例或链接将不胜感激。提前致谢。

这是我的 C 代码:(Java 方法在没有方法声明的情况下实现相同的代码;欢迎提供有关如何加快速度的任何建议)。

int  find2(int matches[][4], int total)
{
int i, j, k, l, matches_count;

i = 1;

while (i <= total)
{

j = i + 1;

while (j <= total)
{

matches_count = 0;

for (k = 1; k <= 2; k++)
{

for (l = 1; l <= 2; l++)
{

if (matches[i][k] == matches[j][l])
{

matches_count += 1;

}

}

}

if (matches_count == 2)
{

matches[i][3] += 1;

for (k = j; k <= (total - 1); k++)
{

for (l = 1; l <= 3; l++)
{

matches[k][l] = matches[k + 1][l];

}

}

j -= 1;

total -= 1;

}

j += 1;

}

i += 1;

}

return total;
}

最佳答案

您本质上需要在 Java 和 native 代码之间共享内存。有几种方法可以做到这一点:

  • 直接字节缓冲区 (NIO)
  • com.sun.jna.Memory
  • 原始数组

在所有这三种情况下,您基本上都有一个内存块,并且由您的 native 代码以与 Java 代码访问它的方式兼容的方式对其进行索引(行优先、列优先或其他某种方式)格式)。对于您的 native 代码,所有三种类型都显示为指向缓冲区的指针。

原始数组为您提供了从 Java 端最简单的访问,但如果必须在将数据传递到 native 代码之前和之后复制数据,则可能会导致性能下降。虚拟机可能以不同的方式存储原始数组(并非全部连续)。

直接缓冲区和 JNA Memory 使用 native 内存,并且在从缓冲区读取数据之前不会产生任何复制成本。您应该在自己的环境中测试哪一个更易于使用和/或更高性能。

关于java - JNA 是否允许通过引用或值将二维数组传递给 C?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27759683/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com