这次c++底层的内存泄漏怎么说呢,让你了解了更多指针内存的东西,说更多了解,反而发现有更多的不了解了,比如指针和整数互转的问题,jni jna真是处处是坑……
jni jna底层指针的手动释放
jna里有个Pointer类对底层指针的抽象,也要手动释放,不然也是内存泄漏
https://blog.csdn.net/ctwy291314/article/details/84872623
Java进程的内存包括Java NonHeap空间、Java Heap空间和Native Heap空间。
JNA中的Memory对象是从Native Heap中分配空间。但java的GC是针对Java Heap空间设计的,当Java Heap空间不足时会触发GC,但Native Heap空间不够却不会触发GC。
所以,当Java Heap占用空间不大时,并不会GC掉Memory对象,也就不会执行finalize()方法从而释放分配的Native Heap空间。
jdoubleArray jniarray = (jdoubleArray)env->GetObjectArrayElement(jobjarr, i);
//jni里拿到的指针都得释放
jdouble*coldata = env->GetDoubleArrayElements(jniarray, NULL);
data_x[i] = coldata[0];
data_y[i] = coldata[1];
data_z[i] = coldata[2];
//jni里拿到的指针都得释放
env->ReleaseDoubleArrayElements(jniarray, coldata, 0);
这里用 env->NewDoubleArray(3);
new了对象要不要释放?
答案是不用的,这块内存返回java后由java管理了
jdoubleArray newIntArray = env->NewDoubleArray(3);
jdouble fill[3];
for (int i = 0; i < 3; i++) {
fill[i] = result[i]; // put whatever logic you want to populate the values here.
}
////把jint指针中的元素设置到jintArray对象中
env->SetDoubleArrayRegion(newIntArray, 0, 3, fill);
return newIntArray;
String name = ManagementFactory.getRuntimeMXBean().getName();
System.out.println(name);
// get pid
String pid = name.split("@")[0];
System.out.println("Pid is:" + pid);
https://www.codenong.com/1632367/
https://cloud.tencent.com/developer/article/1032285
c++属性对象里的指针也必须释放
~JniLasTrans() {
pj_free(pj3857);
pj_free(pjgeocent);
cout << "pj_free" << endl;
}
jni,jna,c++层new的内存必须在java层写native方法来释放
大坑,大坑,大大坑
Pointer result = JnaLibrary.Tansformer.transNative(pointer, x, y, z);
if (result == null) {
logger.info("转换结果为空");
return null;
}
double[]a = result.getDoubleArray(0, 3);
Pointer必须得到释放
//该代码在vs下dug模式编译的动态库会直接退出,release模式动态库没有问题
Native.free(Pointer.nativeValue(result));
测试c++层返回数组上层Pointer接收不到数据
尽量不要返回Pointer,可以在java层new好传到底层改掉,不要随便在c++里new