首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >通过JNI在C和Java之间传递指针

通过JNI在C和Java之间传递指针
EN

Stack Overflow用户
提问于 2009-10-28 01:22:53
回答 5查看 58.2K关注 0票数 76

目前,我正在尝试创建一个使用CUDA功能的Java应用程序。CUDA和Java之间的连接工作得很好,但我有另一个问题,我想问一下,我的想法是否正确。

当我从Java调用一个本机函数时,我将一些数据传递给它,这些函数计算一些东西并返回一个结果。有没有可能让第一个函数返回一个指向这个结果的引用(指针),我可以将它传递给JNI,然后调用另一个函数对结果进行进一步的计算?

我的想法是通过将数据留在GPU内存中,并只传递对它的引用,以便其他函数可以使用它,从而减少从GPU复制数据所产生的开销。

在尝试了一段时间后,我自己认为这是不可能的,因为指针在应用程序结束后被删除(在本例中,当C函数终止时)。这是正确的吗?或者我只是在C中做得太差了,看不到解决方案?

Edit:好吧,稍微扩展一下这个问题(或者说得更清楚一些):JNI本机函数分配的内存是否在函数结束时释放?或者,我是否仍然可以访问它,直到JNI应用程序结束或手动释放它?

感谢您的意见:)

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-10-28 07:30:43

我使用了以下方法:

在JNI代码中,创建一个包含对所需对象的引用的结构。当您第一次创建此结构时,将其指针作为long返回给java。然后,在java中,你只需调用任何带有这个long作为参数的方法,然后在C中将它转换为指向你的结构体的指针。

该结构将在堆中,因此它不会在不同的JNI调用之间被清除。

编辑:我不认为你可以使用long ptr = (long)&address;,因为address是一个静态变量。按照Gunslinger47建议的方式使用它,即创建类或结构的新实例(使用new或malloc)并传递其指针。

票数 49
EN

Stack Overflow用户

发布于 2009-10-28 02:00:04

Java不知道如何处理指针,但它应该能够存储本机函数返回值中的指针,然后将其交给另一个本机函数处理。C指针只不过是核心的数字值。

另一个contibutor必须告诉您指向图形内存的指针是否会在两次JNI调用之间被清除,以及是否会有任何变通方法。

票数 11
EN

Stack Overflow用户

发布于 2011-11-28 16:18:36

我知道这个问题已经得到了正式的回答,但我想添加我的解决方案:将指针放在Java数组中(索引为0)并将其传递给JNI,而不是尝试传递指针。JNI代码可以使用GetIntArrayRegion/SetIntArrayRegion获取和设置数组元素。

在我的代码中,我需要本地层来管理一个文件描述符(一个打开的套接字)。Java类保存一个int[1]数组,并将其传递给本机函数。本机函数可以对其执行任何操作(get/set),并将结果放回数组中。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1632367

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档