通过JNI将多个参数从java传递到c ++应用程序

时间:2013-12-17 15:16:20

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

在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函数的参数中。

2 个答案:

答案 0 :(得分:2)

首先,您需要声明本机java函数:

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

然后你需要在c ++部分实现这个方法。调用javah将为您的原生函数创建签名。

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

之后,您只需调用自己的CppGotMessage功能。

答案 1 :(得分:0)

有一些工具可以帮助您使用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实现的函数。当您需要签名来查找通过JNI调用的Java方法时,javap -s非常有用。 JNI设计师的这本书非常有用, The Java™ Native Interface: Programmer’s Guide and Specification