![]() |
1
3
你说得对,不知何故,这方面的文档并不容易找到。 但我仍然记得以前的一个项目中我做这件事的方式。 你必须阅读一些免费的在线文档,因为我可能会错过一些细节。我会在这篇文章的结尾给你链接。 因此,如果我理解您的正确性,您希望从java调用一个本地C++函数。 首先,记住java本机接口不是C++,而是C。 这就像大多数高级编程语言的本机接口一样(我到目前为止所见过的)。
如果本机函数已在当前进程中加载,则不必执行最后一步4。如果你在CPP应用程序中嵌入Java应用程序。在这种情况下,你可能想看看 RegisterNatives .
Java关键字的文档
JNI的文档如下:
还可以查看Java编译器的文档,了解如何生成本机头。寻找选择
. 编辑 不知怎的,我今天比昨天更理解你的问题:
好的,加上你已经知道的,再加上我在上面给出的解释,这是可以做到的。 实际上,它可以用不同的方式再次实现。 我将解释一个简单的例子:
您的C++应用程序已经知道在java方法完成时需要调用哪个回调。
当调用Java方法时,将回调作为
但是Java不能通过取消对整数/指针的引用来调用回调。
现在你调用一个本地人
我认为这个想法现在已经非常清楚了。
如果你想有更多的可移植代码,那么不要使用回调地址作为键。
而是使用整数甚至字符串,并使用
|
![]() |
2
2
好了,我来告诉未来的读者我是如何做到的。有几点对我来说似乎不太干净,如果有人对如何更干净地做这件事有想法,我会对此非常感兴趣。 所以,我在包FO中编写了一个简单的java类条,它将从C++调用,传递一个函数的引用(下面更多),并调用一些硬编码的函数。
如你所见,我还编写了一个类函子,这也很简单 包福;
这取决于我称之为函子的共享库。实现非常简单。这样做的目的是将实际逻辑分开,只在共享对象中提供接口。如前所述,主要的缺点是我必须为每个签名都写,我看不出有任何方法可以将其模板化。 为了完整起见,以下是共享对象的实现:
最后,这里是我在C++中如何调用它,在运行时定义共享函数之外的回调函数:
这个很好用,我可以用这个。不过,有几件事仍然困扰着我:
|
|
user29759326 · 如何返回递归函数中的最后一个值? 3 月前 |
|
malife89 · 将java中的字符串读取为正确的日期格式 4 月前 |
![]() |
Tim · 在java中,有没有更快的方法将字节数组写入文件? 4 月前 |
![]() |
rudraraj · java中未声明最终变量 4 月前 |
![]() |
Bala Ji · 以下BFS的实施效率如何? 4 月前 |