【问题标题】:Question about C++ global variable in JNI on android关于android上JNI中C++全局变量的问题
【发布时间】:2021-10-13 05:38:22
【问题描述】:

在 Android 上的 JNI 中使用 C++ 全局变量是否可以接受?

如果是这样,我想知道它的生命周期。

当 a.cpp 连接到 b.java 并创建 b 的实例(此时是否初始化全局变量?)和销毁(此时是否销毁全局变量?)。

简而言之,C++ 端的全局变量与连接的 Java 实例共享生命周期?

【问题讨论】:

  • 全局变量是否引用了jobject?如果不是,它与托管变量的本机库的生命周期相关联。
  • 如果我在b的构造函数作用域(非静态)中绑定native-lib,那么实例b被销毁时它会被销毁吗?
  • 没有。正如我所说,本机对象的生命周期与本机库有关。 Java 世界中发生的任何事情都无关紧要。
  • 那你知道原生库的生命周期吗?当我像下面这样绑定native-lib时------------------------ class b { init { System.loadLibrary("native-lib") } }
  • 它会一直加载,直到加载它的类加载器被销毁。在实践中,它会永远保持加载状态。

标签: android c++ java-native-interface


【解决方案1】:

本机对象的生命周期与托管它们的本机库的生命周期相关联。 反过来,这由 loaded the library 的 Java ClassLoader 的生命周期控制:

此外,原生库可以在其对应的类加载器被垃圾回收时被卸载。

在永远不会发生的 Android 应用程序中,因此您可以假设您的原生对象与应用程序一样长。

【讨论】:

    最近更新 更多