java - JNI:在 C++ 中对 jarray 的全局引用
问题描述
我正在编写一个 java 程序,它广泛使用本地方法和用 C++ 实现的 JNI。在 C++ 方面,我有一个本地引用jarray
,我想将其转换为全局引用。我认为很简单:调用env->NewGlobalRef(array_ref)
. 而且,确实,这行得通——但结果是 a jobject
,而不是 a jarray
。将其降级为 a 是否安全jarray
?如果没有,我可以从中恢复jarray
吗?请注意,我在 C++ 中,它们不仅仅是彼此的 typedef。
解决方案
是的,这应该是安全的,因为 ajarray
是jobject
[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;
:
很明显,这些只是实现子类型化的虚拟类,jarray
andjobject
是类型_jobject*
,_jarray*
并且类_jarray
只是继承自_jobject
以证明is-a
关系。
推荐阅读
- ruby - jekyll serve --livereload 失败并显示“无法加载 EventMachine C 扩展;要使用纯红宝石反应器,需要 'em/pure_ruby'”
- r - 使用 glob2rx list.files 提取文件
- apache-camel - 在 micronaut 上运行 apache camel cxf route
- linux - 如何从 Linux 终端(公共 IP)访问和执行 Windows 机器(公共 IP)中的命令
- google-apps-script - 谷歌表格的脚本通过点击计算时间?
- jenkins - 在管道脚本中找不到 Jenkins 触发器插件,“无效的触发器类型有效的触发器类型”
- python - ewm() 是否在滚动窗口或熊猫的整个列中加权?
- javascript - 谷歌表 .getvalues 没有给出任何值
- reactjs - React + Redux 在 App.js 的渲染中分派 3 次动作
- java - 是什么导致我的 Wildfly BOM 编译错误