使用c ++和JNI共享内存分配

时间:2011-12-02 13:14:31

标签: java c++ java-native-interface swig

我正在用Java编写一个C ++程序包装器。包装器使用SWIG完成。我有以下问题:当我从Java调用一个用C ++创建一个大对象的函数时,Java没有“看到”它已经分配了大量内存,因为它没有在Java堆中分配。问题是当从Java端删除对象时没有调用垃圾收集器,因为有足够的可用内存。我试过的是实现这里描述的内容:http://www.swig.org/Doc1.3/Java.html#java_heap_allocations。我们的想法是在Java堆中为C ++分配内存空间。由于我不想对每个new使用它,我已重命名newdelete并在需要时从我的C ++代码中明确使用它们。

这个机制似乎有效(我可以看到Java的堆正在被垃圾收集器增长和缩小)但不幸的是我在memcpy期间似乎发生了随机崩溃。

如果我手动调用垃圾收集器,我的程序正在运行,但这不是一个非常干净的方法。

感谢任何线索。

2 个答案:

答案 0 :(得分:2)

事实上,我没有注意到swig网站中的以下内容:

  

如果要使用gcc打开优化(例如-O2),请确保使用-fno-strict-aliasing进行编译

这似乎已经解决了问题

答案 1 :(得分:1)

难道你不能简单地通过SWIG手动调用C ++对象析构函数吗?这似乎对我有用。