JNI访问的代码中的普通C ++对象

时间:2014-06-02 13:43:03

标签: java android java-native-interface

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

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

我需要确认这个问题,因为我知道有特殊的JNI方法来处理对象(相关术语:本地参考,全局参考等)。如果我是正确的,那么这些仅适用于(或为Java代码创建)的对象。

因此,我认为可以通常的方式创建和删除纯本机C ++对象(例如newdelete),Java不需要了解它们。只要对象及其对它们的任何引用仅驻留在C ++层中,就不需要特殊的互操作性考虑因素。它是否正确?我可以在这个层中定义C ++类和方法,就像它是一个没有任何JNI / Java互操作性的普通C ++应用程序一样吗?一般来说,它是否允许实例化和存储普通C ++对象,即不受Dalvik / JVM授权的对象?

1 个答案:

答案 0 :(得分:1)

实际上,处理对象的JNI方法是用于 Java对象

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

  1. 将指针转换为整数并将该整数传递给Java。 (你必须关心存储在垃圾收集的Java对象中的指针,你看,整数并不意味着释放本机内存。)

  2. 拥有一些带有所有必要参考资料的C / C ++数据结构。

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

    从一个线程访问静态全局变量可以获得良好的结果。

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