- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发 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 op
和char *
数组,您就可以简单地调用例程: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/
我是一名优秀的程序员,十分优秀!