gpt4 book ai didi

java - 如何为 Traceroute C 文件创建 JNI 接口(interface)

转载 作者:行者123 更新时间:2023-11-30 16:17:09 25 4
gpt4 key购买 nike

我正在开发 Android 应用程序,它是一个网络实用程序。其中一项实用程序是使用 Activity 和 xml 文件实现跟踪路由。在java中实现traceroute有点痛苦,所以我查看了JNI和C代码。有一个名为 busybox 的实用程序,其中包含许多 Linux 工具。它是开源的并且有traceroute。这是 github 上的代码 https://raw.githubusercontent.com/mirror/busybox/master/networking/traceroute.c我的问题是如何在 java 中为此文件实现 JNI 接口(interface)。编译的文件充当命令行工具,您可以运行该工具并传递要跟踪路由的主机的参数。这是否意味着我必须只实现 JNI 中的 main 方法。另外,该文件没有 JNI 类型方法,因此我无法直接与其交互。我是否需要创建另一个使用 JNI C 代码调用 Traceroute main 方法的 C 文件。欢迎任何意见

最佳答案

您要调用此方法:common_traceroute_main(int op, char **argv)

您必须使用 github 中的代码创建共享库。看看这里

http://jnicookbook.owsiak.org/recipe-No-001/

获得库后,您必须在 Java 中准备参数并将它们传递给 JNI 代码,在 JNI 代码中您需要将它们解压并转换为 common_traceroute_main 所期望的内容。

例如。您可以传递 String 数组并将其转换为 char **argv

http://jnicookbook.owsiak.org/recipe-No-009/

然后,您所要做的就是从 JNI 包装器中调用 common_traceroute_main

解决方案草案

您将需要 Java 代码,例如,类似这样的代码

public class TraceCaller {
public static native callTraceRoute(int op, String[] args);
}

一旦使用javac -h headers TraceCaller编译它,您将找到C头文件。

在此头文件中,您必须从字符串数组中提取值。看一下这里( https://github.com/mkowsiak/jnicookbook/blob/master/recipes/recipeNo038/java/recipeNo038/PassHashMap.java ),了解如何从 JNI 代码内的数组检索 String 对象并将其转换为 char*.

一旦您(在JNI内部)拥有:int opchar *数组,您就可以简单地调用例程:common_traceroute_main .

一旦完成,您必须将数据传回(作为返回值或通过传递给 JNI 的对象)。

查看此处的示例,该示例展示了如何将 String 传递回 Java:

https://github.com/mkowsiak/jnicookbook/tree/master/recipes/recipeNo010

而且,你已经完成了:)

关于java - 如何为 Traceroute C 文件创建 JNI 接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56327158/

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