在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函数的参数中。
答案 0 :(得分:2)
首先,您需要声明本机java函数:
native JavaMessageNative(int msgNo, int msgLen, int[] msgData, long msgTimestamp);
然后你需要在c ++部分实现这个方法。调用javah
将为您的原生函数创建签名。
在此函数中,您首先需要将java类型转换为本机类型。对于整数,这是微不足道的,但int[]
需要使用适当的JNI
函数。搜索GetIntArrayElements
。
之后,您只需调用自己的CppGotMessage
功能。
答案 1 :(得分:0)
有一些工具可以帮助您使用JNI:
JNA使用JNI,但您使用Java而不是C ++编写自定义粘合代码。 JNAerator可以从.h文件生成Java粘合代码。我建议你写一个简化的.h文件,只需要调用你的函数所需的声明。
SWIG使用JNI,但您编写了一个接口定义文件(带注释的.h)文件,而不必编写任何粘合代码。与使用JNAerator一样,您应该最小化.h文件中的声明。
如果您自己使用JNI,javah
会将Java类的native
成员转换为C ++ .h文件,其中包含使用JNI API实现的函数。当您需要签名来查找通过JNI调用的Java方法时,javap -s
非常有用。 JNI设计师的这本书非常有用, The Java™ Native Interface: Programmer’s Guide and Specification。