我在Android应用程序上工作,这是一个网络实用程序。其中一个实用程序是使用活动和xml文件的traceroute实现。在java中实现traceroute是一种痛苦,所以我研究了JNI和C代码。有一个叫做busybox的实用程序包含了许多linux工具。它是开源的,并且有traceroute。这是github的代码,我的问题是如何在https://raw.githubusercontent.com/mirror/busybox/master/networking/traceroute.c中实现这个文件的JNI接口。one编译的文件充当命令行工具,您可以运行该工具并传递要跟踪的主机的参数。这是否意味着我只需要在JNI中实现main方法。另外,这个文件没有JNI类型的方法,所以我不能直接与它交互。我是否需要创建另一个使用JNI C代码调用traceroute main方法的C文件。感谢您的任何意见
发布于 2019-05-27 23:08:34
您希望调用此方法: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 *数组,就可以简单地调用char *:common_traceroute_main。
一旦完成,您必须回传数据(作为返回值或通过传递给JNI的对象)。
看看这里的示例,它展示了如何将String传递回Java:
https://github.com/mkowsiak/jnicookbook/tree/master/recipes/recipeNo010
然后,您就完成了:)
https://stackoverflow.com/questions/56327158
复制相似问题