【问题标题】:How Can I Create JNI Interface for Traceroute C File如何为 Traceroute C 文件创建 JNI 接口
【发布时间】:2019-05-27 13:36:03
【问题描述】:

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

【问题讨论】:

    标签: java android c android-ndk java-native-interface


    【解决方案1】:

    你要调用这个方法:common_traceroute_main(int op, char **argv)

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

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

    一旦你有了你的库,你必须在 Java 中准备参数并将它们传递给 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包装器然后生成头文件最后写你的c本机代码。 traceroute 文件采用 main 方法并将字符串打印到屏幕上。我的与 traceroute 接口的 c 本机文件不会那么复杂。第一次做jni
    • 是的,我知道你解释了什么,但我正在编写将与 traceroute 接口的本机 c 代码,因为我无法直接从 java 访问 traceroute,因为不是用本机编写的。我需要一些可以将 args 从 java 传递到 traceroute 的本机方法。然后将返回字符串传回java
    • 我的 traceroute c 文件的问题是它是无效的。它将所有 printf 打印到标准输出。如何获得该输出并在 java 中使用它?
    • 您可以使用 dup 方法将标准输出重定向到文件。看看这里:stackoverflow.com/questions/45083058/jni-printf-to-log4j/… - 好吧,将所有这些东西联系在一起并不是小菜一碟。但是,您正在进入低级领域:(
    • 我正在使用简单的 printf 测试应用程序,但没有任何内容打印到控制台...如果我将其更改为 return 语句,我会返回字符串,但看不到 printf 工作...在哪里c 中的 printf 打印标准输出?
    猜你喜欢
    • 2013-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-01
    • 1970-01-01
    相关资源
    最近更新 更多