gpt4 book ai didi

java - JNI 访问的代码中的纯 C++ 对象

转载 作者:行者123 更新时间:2023-11-30 02:51:52 25 4
gpt4 key购买 nike

我的 Android 应用程序有一个原生 C++ 层和一个 Java 层。 Java 层通过 JNI 调用访问 native 层。

C++ 层能否安全地创建 C++ 对象供其内部使用,并将它们存储在 C++ 成员变量中?我说的是不需要通过 Java 代码以任何方式访问的 C++ 对象,即它们完全在 C++ 层中进行管理和删除。换句话说,同一个对象(通过成员变量)在多个 JNI 调用中被访问,但只有 C++ 层需要访问它。

这件事我需要确认一下,因为我知道有专门的JNI方法来处理对象(相关术语:局部引用,全局引用等)。如果我是正确的,这些仅适用于 Java 代码可见(或为 Java 代码创建) 的对象。

因此,我认为可以通过通常的方式(例如newdelete)创建和删除仅限 native 的 C++ 对象,而 Java 不需要了解他们的任何事情。不需要特殊的互操作性考虑,只要对象和对它们的任何引用专门驻留在 C++ 层中即可。它是否正确?我能否在这一层中定义 C++ 类和方法,就好像它是没有任何 JNI/Java 互操作性的普通 C++ 应用程序一样?一般而言,是否允许实例化和存储纯 C++ 对象,即超出 Dalvik/JVM 权限的对象?

最佳答案

确实,处理对象的 JNI 方法是针对 Java 对象的。

您可以用您能想到的任何方式(malloc/new)创建 C/C++ 对象,但是:您将如何在 JNI 调用中保留它们? (当然,如果您需要的话。)两个选项:

  1. 将指针转换为整数并将该整数传递给 Java。 (您将不得不关心存储在垃圾收集的 Java 对象中的指针,您知道,整数并不意味着释放 native 内存。)

  2. 拥有一些 C/C++ 数据结构以及所有必要的引用资料。

线程安全值得单独考虑;如果您尝试将指针存储在线程局部变量中,您可能永远不会调试代码(您知道,存在生命周期不匹配)。

仅从一个线程访问静态全局变量可能会取得好的结果。

请记住,Android 可能会终止并重新启动您的应用程序进程,从而破坏存储在静态变量中的所有内容以及您的 native 数据结构。

关于java - JNI 访问的代码中的纯 C++ 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23996032/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com