使用指示器的c++和Java之间SWIG多态性中的内存泄漏
Memory leak in SWIG polymorphism across C++ and Java using directors
我有一个c++程序从网络接收二进制数据。接收到数据后,它将把数据作为字节数组从c++回调到Java客户机。我使用SWIG中的director特性来轻松实现跨c++和Java的跨语言多态回调。这是一个链接。
但是我发现在SWIG中没有从c++中的char*到Java中的byte[]的类型映射。所以我给病毒加了补丁。这是一个链接。
/*Director specific typemaps*/
%typemap(directorin, descriptor="[B") char *BYTE {
jbyteArray jb = (jenv)->NewByteArray(strlen(BYTE));
(jenv)->SetByteArrayRegion(jb, 0, strlen(BYTE), (jbyte*)BYTE);
$input = jb;
}
%typemap(directorout) char *BYTE {
$1 = 0;
if($input){
$result = (char *) jenv->GetByteArrayElements($input, 0);
if(!$1)
return $null;
jenv->ReleaseByteArrayElements($input, $result, 0);
}
}
%typemap(javadirectorin) char *BYTE "$jniinput"
%typemap(javadirectorout) char *BYTE "$javacall"
例如。我在c++中有一个类叫做a:
class A{
public:
virtual void onDataReceived(const char* BYTE, const size_t len) {}
};
然后在Java代码中我有另一个类B来扩展A:
class B extends A {
@Override
public void onDataReceived(byte[] data, long len) {
//handling the data.
}
}
我可以在Java代码中接收字节数组,但它似乎永远不会被JVM垃圾收集。SWIG生成的包装器文件中的onDataReceived方法如下所示:
void SwigDirector_A::onDataReceived(char const *BYTE, size_t const len) {
JNIEnvWrapper swigjnienv(this);
JNIEnv * jenv = swigjnienv.getJNIEnv();
jobject swigjobj = (jobject) NULL;
jbyteArray jBYTE = 0;
jlong jlen;
if (!swig_override[3]) {
A::onDataReceived(BYTE,len);
return;
}
swigjobj = swig_get_self(jenv);
if (swigjobj && jenv->IsSameObject(swigjobj, NULL) == JNI_FALSE) {
{
jbyteArray jb = (jenv)->NewByteArray(strlen(BYTE));
(jenv)->SetByteArrayRegion(jb, 0, strlen(BYTE), (jbyte*)BYTE);
jBYTE = jb;
}
jlen = (jlong) len;
jenv->CallStaticVoidMethod(Swig::jclass_DataTransferJNI, Swig::director_methids[3], swigjobj, jBYTE, jlen);
if (jenv->ExceptionCheck() == JNI_TRUE) return;
} else {
SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object");
}
if (swigjobj) jenv->DeleteLocalRef(swigjobj);
}
在我的c++代码中,我将在回调完成后删除接收缓冲区中的数据。但是我从Java VisualVM检查了Java客户端进程使用的内存在很长一段时间后没有GC-ed。提前感谢任何帮助!
p。数据相当大,大约32KB。
我通过在Director typemaps中添加对jb的引用的删除来解决这个问题:(jenv)->DeleteLocalRef(jb);
更新后的补丁
相关文章:
- 多态性和功能结合
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- C++boost序列化多态性问题
- 如何查找哪个类对象位于数组的特定索引上(多态性)
- 如何在多线程中正确使用unique_ptr进行多态性?
- 具有智能指针的多态性
- 在 C++ 中在堆栈上创建实例时如何保持多态性?
- 继承/多态性 - 我是否被迫使用"protected"变量?
- C++ 多态性在代码::块 17.12 中不起作用
- C++ 泛型和多态性:这种模式可行吗?
- 为什么我们实际上需要运行时多态性?
- 如何在这个简单的最小示例中实现多态性?
- 如何使用静态多态性在 int 和指针类型之间进行转换?
- 无法初始化已知大小的矢量指针,该大小不会因多态性而更改
- 运行时多态性和dynamic_cast需要澄清
- 如何调用指针类型的方法(禁用多态性)?
- 从基类调用函数的多态性
- 运行时多态性 - 箭头运算符访问了错误的成员?
- 使用指示器的c++和Java之间SWIG多态性中的内存泄漏