目前,我正在尝试创建一个使用CUDA功能的Java应用程序。CUDA和Java之间的连接工作得很好,但我有另一个问题,我想问一下,我的想法是否正确。
当我从Java调用一个本机函数时,我将一些数据传递给它,这些函数计算一些东西并返回一个结果。有没有可能让第一个函数返回一个指向这个结果的引用(指针),我可以将它传递给JNI,然后调用另一个函数对结果进行进一步的计算?
我的想法是通过将数据留在GPU内存中,并只传递对它的引用,以便其他函数可以使用它,从而减少从GPU复制数据所产生的开销。
在尝试了一段时间后,我自己认为这是不可能的,因为指针在应用程序结束后被删除(在本例中,当C函数终止时)。这是正确的吗?或者我只是在C中做得太差了,看不到解决方案?
Edit:好吧,稍微扩展一下这个问题(或者说得更清楚一些):JNI本机函数分配的内存是否在函数结束时释放?或者,我是否仍然可以访问它,直到JNI应用程序结束或手动释放它?
感谢您的意见:)
发布于 2009-10-28 07:30:43
我使用了以下方法:
在JNI代码中,创建一个包含对所需对象的引用的结构。当您第一次创建此结构时,将其指针作为long
返回给java。然后,在java中,你只需调用任何带有这个long
作为参数的方法,然后在C中将它转换为指向你的结构体的指针。
该结构将在堆中,因此它不会在不同的JNI调用之间被清除。
编辑:我不认为你可以使用long ptr = (long)&address;
,因为address是一个静态变量。按照Gunslinger47建议的方式使用它,即创建类或结构的新实例(使用new或malloc)并传递其指针。
发布于 2009-10-28 02:00:04
Java不知道如何处理指针,但它应该能够存储本机函数返回值中的指针,然后将其交给另一个本机函数处理。C指针只不过是核心的数字值。
另一个contibutor必须告诉您指向图形内存的指针是否会在两次JNI调用之间被清除,以及是否会有任何变通方法。
发布于 2011-11-28 16:18:36
我知道这个问题已经得到了正式的回答,但我想添加我的解决方案:将指针放在Java数组中(索引为0)并将其传递给JNI,而不是尝试传递指针。JNI代码可以使用GetIntArrayRegion
/SetIntArrayRegion
获取和设置数组元素。
在我的代码中,我需要本地层来管理一个文件描述符(一个打开的套接字)。Java类保存一个int[1]
数组,并将其传递给本机函数。本机函数可以对其执行任何操作(get/set),并将结果放回数组中。
https://stackoverflow.com/questions/1632367
复制相似问题