java - 用另一种语言包装 C++ 对象的策略——内存管理

标签 java c++ objective-c api

我有一个 C++ 库,我希望所有核心逻辑都在其中发生。我想用不同的语言(例如 Objective C 和 Java)为它创建包装器,这将是唯一向开发人员公开的接口(interface)。

我面临的问题是包装器对象的内存管理。

考虑 C++ 对象:

class Node {
public:
  std::vector<std::shared_ptr<Node>> children;
  void addChild(std::shared_ptr<Node> node);
}

让我们假设我有一个 Java 对象 JNode,它盲目地包装 Node,传递所有内容。

public void doSomething() {
  JNode node = new JNode();
  someOtherNode.addChild(node);
}

当此方法返回时,Java 对象将被销毁,但 C++ 对象将通过 std::shared_ptr 保持 Activity 状态。

现在,假设我想遍历某个节点的子节点。它们对应的 Java 对象已经丢失,所以我需要在每次访问时重新创建它们。如果开发人员保留对原始 Java 对象的引用,而现在这些对象将有所不同,这似乎代价高昂并且可能会造成混淆。

我曾考虑过缓存 Java 对象的想法,但由于 C++ 端可能正在创建新节点,而这些节点没有相应的 Java 对象,这使情况变得更加复杂。这也使内存管理变得困难,因为 C++ 端可能会删除节点,这样就没有剩余的引用,但 Java 缓存会让它们保持 Activity 状态。

是否有更好/已知的策略来处理此类用例?

最佳答案

很高兴这已经为您解决了。

http://www.swig.org/

SWIG is a software development tool that connects programs written in C and C++ with a variety of high-level programming languages. SWIG is used with different types of target languages including common scripting languages such as Javascript, Perl, PHP, Python, Tcl and Ruby. The list of supported languages also includes non-scripting languages such as C#, Common Lisp (CLISP, Allegro CL, CFFI, UFFI), D, Go language, Java including Android, Lua, Modula-3, OCAML, Octave, Scilab and R. Also several interpreted and compiled Scheme implementations (Guile, MzScheme/Racket, Chicken) are supported

关于java - 用另一种语言包装 C++ 对象的策略——内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33673959/

相关文章:

ios - 通过 preparesegue 将图像从一个 View 传递到另一个 View ?

objective-c - 如何确定选择器的参数/关键字的数量

java - 检查一个数组是否大于另一个

c++ - 除 44.1kHz 之外的任何速率的 WAV 文件都会使声音变得困惑

java - 用户注释如何工作?

c++ - 如何在 native 桌面 Windows 应用程序中使用 Direct2D 呈现子窗口?

c++ - opencv CV_ENABLE_UNROLLED 这个特性有什么作用?

ios - 带有七个选项卡的选项卡栏 Controller ,五个选项卡导致 Split View Controller

Java 安卓标签

java - NoSuchAlgorithmException : Algorithm HmacSHA1 not available