由于项目需要初接触JNA。
过程中遇到DLL库中malloc空间,将指针返回到JNA后需要释放DLL中malloc的空间。
考虑到DLL和JAVA程序应该是两块不同的内存空间,并且JAVA并未提供对应手动释放该类空间的方法。故在DLL中自定义free函数。通过JNA调用该free函数来释放DLL中malloc的空间。
为测试该方法是否可行,写死循环进行测试,发现占用内存依旧一直上涨,后经过了解JNA调用C函数机制为异步调用机制,所以在调用free后并不会立刻释放掉该内存。多睡一会儿就能看到内存确实有释放掉。
JAVA代码
public class JNATest {
public interface Clibrary extends Library{
Clibrary INSTANTCE = (Clibrary)Native.loadLibrary("JnaTest", Clibrary.class);
int jnaTest(PointerByReference outputString);
int jnaFree(Pointer p);
}
public static void main(String[] args) throws InterruptedException {
PointerByReference pointerOut = new PointerByReference();
while(true){
for(int i = 0;i < 10;i++) {
Clibrary.INSTANTCE.jnaTest(pointerOut);
Clibrary.INSTANTCE.jnaFree(pointerOut.getValue());
}
Thread.sleep(10000);
}
}
}