JNI 如何将 Java 对象数组传递给相同对象类型的 C++ 数组
JNI how to pass an array of java objects to a c++ array of the same object type
我的java代码中有一个类型Foo
数组,我想传递给c ++。在 c++ 代码中,我也有一个名为Foo
的相同类。我想要的只是通过 JNI 传输这个数组。
我有一个这样的电话:
#include "headers/Foo.h"
extern "C"
JNIEXPORT void
JNICALL Java_main_Main_Interface(JNIEnv *env, jobject obj, jobjectArray foo){
jint size = env->GetArrayLength(foo);
Foo cfoo[size];
for(int i = 0; i < size; i++){
cfoo[i] = env->GetObjectArrayElement(foo, i);
}
}
但是,这给了我一个错误:Type 'Foo' and 'jobject' are not compatible
我理解这个错误,但我应该怎么做才能消除它? 我应该将 jobject 转换为类型 Foo 吗? C++ 会以这种方式理解对象吗? 还是我错过了一些 JNI 调用?
我理解这个错误
不,我认为你不会。
C++代码中名为Foo
的类型与 JavaFoo
无关。 具有相同的名称不会跨 JNI 边界产生此效果,无论类型成员的相似性或不同性如何。 因此,你的问题不仅仅是一个句法问题,而是一个更基本的问题。
但是我应该怎么做才能消除它呢? 我应该将 jobject 转换为类型 Foo 吗? C++ 会以这种方式理解对象吗? 还是我错过了一些 JNI 调用?
这在一定程度上取决于C++Foo
的性质,以及你希望它如何工作。
一种选择是通过复制相应 JavaFoo
的所需成员来初始化每个C++Foo
。 这将涉及JNI调用来读取对象字段或调用jobject
上的方法,或两者兼而有之。 细节取决于两个Foo
。
或者,你可以重写或子类化C++Foo
,使其成为表示相应JavaFoo
的jobject
的包装器,C++方法通过JNI调用委托给jobject
。 实际上,这几乎与另一个相同,但具有更精细的粒度,因此具有不同的性能权衡。
相关文章:
- 将对象数组的引用传递给函数
- 如何使用Visual Studio 2017在C++中为参数化对象数组使用唯一指针
- 在c++中尝试对对象数组进行排序时,出现std:bad_alloc错误
- 类对象数组的问题会导致崩溃
- Arduino C++在构造函数中用参数声明对象数组
- 使用对象数组对 SFML 进行动画处理
- C++ 对象数组堆栈溢出
- 如何将对象数组作为参数传递给模板
- 使用向量初始化参数化构造函数的对象数组
- 如何初始化对象数组?
- C++创建对象数组
- 在对象数组中搜索字符串并返回相应值的函数
- 有没有办法使用该类的构造函数初始化另一个类的私有部分内的对象数组?
- 如何在运行时在对象数组中动态追加新对象C++并打印它们
- 为什么我在声明对象数组时不能使用 -> 运算符?
- 编译时生成应在构造函数中创建的非 constexpr 对象数组
- 使用 C++ 创建对象数组
- 对象数组打印空白字符串
- 重载运算符 [] 用于从对象数组中给出特定索引
- 如何在 C++ 中使用提升属性树从 JSON 文件中读取对象数组