【发布时间】:2020-10-12 18:29:13
【问题描述】:
在 C++ 中,我有以下头文件:
/** Default constructor */
CLPLIB_EXPORT Clp_Simplex *CLP_LINKAGE Clp_newModel(void);
/** Destructor */
CLPLIB_EXPORT void CLP_LINKAGE Clp_deleteModel(Clp_Simplex *model);
尝试使用 JNA 导入它,我假设我必须这样指定它们:
public static native PointerByReference Clp_newModel();
public static native void Clp_deleteModel(Pointer pModel);
这是正确的,应该是Clp_deleteModel(PointerByReference pModel) 吗?奇怪的是,两者似乎都在一个非常简单的测试中工作,尽管前者对我来说更有意义。我认为 JNA 发挥了一些作用。
// option 1
PointerByReference a = Clp_newModel();
ChangeSomthingIntheModel(a,2);
Clp_deleteModel(a.getPointer());
ChangeSomthingIntheModel(a,2); // the JVM signals "illegal memory access here
// option 2
PointerByReference a = Clp_newModel();
ChangeSomthingIntheModel(a,2);
Clp_deleteModel(a); // passing the PointerByReference here!
ChangeSomthingIntheModel(a,2); // the JVM signals "illegal memory access here
【问题讨论】: