使用接口在JNI中实现回调函数
我需要使用“接口”在Java中实现回调函数。我将应用程序部分编写为 MyJavaFunction(int size, m_GetSizeInterface);
m_GetSizeInterface 是一个包含回调函数 GetSize 的接口。此 GetSize 方法在应用程序中被重写。在 JNI 中,我需要调用具有原型的 CPP 函数 int MyCPPFunction(int size, int (*callback)(int* ID));
如何将此 GetSize 作为参数传递给 JNI 中的 MyCPPFunction?请帮忙
public int GetSize (m_SizeClass arg0)
{
g_size = arg0.size;
return 0;
}
I need to implement callback function in Java using “interface”. I have wrote the application part as MyJavaFunction(int size, m_GetSizeInterface);
m_GetSizeInterface is an Interface which contains the callback function GetSize. This GetSize method is override in the application. In JNI I need to call a CPP function having prototype int MyCPPFunction(int size, int (*callback)(int* ID));
How can I pass this GetSize as parameter to MyCPPFunction in JNI? Please help
public int GetSize (m_SizeClass arg0)
{
g_size = arg0.size;
return 0;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这里的复杂之处在于您想要调用本机 C++ 代码,而您又想要调用 java 方法。这其实有点棘手。
需要创建一个JNI C++函数供java调用,以及一个C++函数匹配
MyCPPFunction 回调签名。后者将充当调用 java 方法的包装器。
因为包装器需要有关 JNI 环境的信息,而这些信息不能通过参数提供(以免破坏签名),所以您创建了一些全局变量来保存它:
java 将调用的 C++ 函数如下:
包装器函数是因此:
The complication here is that you want to invoke native C++ code which you, in turn, want to invoke a java method. This is actually a bit tricky.
You need to create a JNI C++ function for java to call, and a C++ function matching
the MyCPPFunction callback signature. The latter will act as a wrapper to call the java method.
Because the wrapper will need information about the JNI environment, which cannot be provided by parameters (lest we ruin the signature) you create a few global variables to hold it:
The C++ function which java will call is the following:
And the wrapper function is thus:
//测试代码为:
//and test code is: