首页 > 解决方案 > JNI:在 C++ 中对 jarray 的全局引用

问题描述

我正在编写一个 java 程序,它广泛使用本地方法和用 C++ 实现的 JNI。在 C++ 方面,我有一个本地引用jarray,我想将其转换为全局引用。我认为很简单:调用env->NewGlobalRef(array_ref). 而且,确实,这行得通——但结果是 a jobject,而不是 a jarray。将其降级为 a 是否安全jarray?如果没有,我可以从中恢复jarray吗?请注意,我在 C++ 中,它们不仅仅是彼此的 typedef。

标签: javac++java-native-interface

解决方案


是的,这应该是安全的,因为 ajarrayjobject[ref]的子类型并且基本上是一个指针。jni.h这是该部分下的相关代码#ifdef __cplusplus

class _jobject {};
class _jclass : public _jobject {};
:
:
class _jarray : public _jobject {};
class _jbooleanArray : public _jarray {};
:

typedef _jobject *jobject;
:
typedef _jarray *jarray;
typedef _jbooleanArray *jbooleanArray;
:

很明显,这些只是实现子类型化的虚拟类,jarrayandjobject是类型_jobject*_jarray*并且类_jarray只是继承自_jobject以证明is-a关系。


推荐阅读