【问题标题】:Pass multiple parameters from java to c++ application via JNI通过 JNI 将多个参数从 java 传递到 c++ 应用程序
【发布时间】:2023-04-08 13:15:02
【问题描述】:

在java端,当有消息接收到时,java函数

JavaMessageReceived(int msgNo, int msgLen, int[] msgData, long msgTimestamp)

会被调用,所以消息的信息会存储在msgNo、msgLen、msgData和msgTimestamp中。

然后我想将msgNo,msgLen和msgData,msgTimestamp中的值传递给c ++端(应用程序)中的一个函数,称为

CppGotMessage(int *no, int *len, int*data, long* timestamp)

当我拨打CppGotMessage()时,我会得到收到的消息的信息。

我如何通过 JNI 做到这一点?(不能使用 JNA 或其他第三方软件)
从这个链接: http://doc-snapshot.qt-project.org/qdoc/qandroidjniobject.html

我注意到 ResigterNatives 对我不起作用,因为当我在 c++ 端调用 CppGotMessage 时,我没有任何参数可以传递给 java 函数。我只需要从 java 函数中获取值并将它们存储在我的 CppGotMessage 函数的参数中..

【问题讨论】:

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


    【解决方案1】:

    首先你需要声明一个本地java函数:

    native JavaMessageNative(int msgNo, int msgLen, int[] msgData, long msgTimestamp);
    

    那么你需要在c++部分实现这个方法。调用 javah 将为您的本机函数创建签名。

    在此函数中,您首先需要将 java 类型转换为本地类型。对于整数,这是微不足道的,但 int[] 您需要使用适当的 JNI 函数。搜索GetIntArrayElements

    之后,您可以简单地调用自己的CppGotMessage 函数。

    【讨论】:

    【解决方案2】:

    有几个工具可以帮助使用 JNI:

    1. JNA 使用 JNI,但您使用 Java 而不是 C++ 编写自定义粘合代码。 JNAerator 可以从 .h 文件生成 Java 胶水代码。我建议您编写一个简化的 .h 文件,仅包含调用函数所需的声明。

    2. SWIG 使用 JNI,但您编写了一个接口定义文件(带注释的 .h)文件,而不必编写任何胶水代码。与使用 JNAerator 一样,您应该尽量减少 .h 文件中的声明。

    3. 如果您自己使用 JNI,javah 会将您的 Java 类的 native 成员转换为 C++ .h 文件,其中包含您使用 JNI API 实现的功能。 javap -s 在您需要签名来查找通过 JNI 调用的 Java 方法时很有用。 JNI设计师的书非常有用,The Java™ Native Interface: Programmer’s Guide and Specification

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-08
      • 2010-10-26
      • 1970-01-01
      • 1970-01-01
      • 2012-07-08
      • 2013-05-30
      相关资源
      最近更新 更多