如何在 JniWrapper 中将 Java ArrayList<float[]> 映射到 C++ Vector<array<float,size>>?
How to map Java ArrayList<float[]> to C++ Vector<array<float,size>> in JniWrapper?
我有一个浮点数组的 ArrayList 作为 ArrayList<float[]>
,我想在 JniWrapper 中映射到 C++ Vector<array<float,size>>
。
我关注了这个link:
"Returning an arraylist of string from Native java to JNI"
并根据我的要求对代码进行了一些更改。
static jclass java_util_ArrayList;
static jmethodID java_util_ArrayList_;
jmethodID java_util_ArrayList_size;
jmethodID java_util_ArrayList_get;
jmethodID java_util_ArrayList_add;
static thread_local JNIEnv *env;
void java2cpp(jobject arrayList, vector<array<float, 320>> &result) {
java_util_ArrayList = static_cast<jclass>(env->NewGlobalRef(
env->FindClass("java/util/ArrayList")));
java_util_ArrayList_ = env->GetMethodID(java_util_ArrayList, "init", "(I)V");
java_util_ArrayList_size = env->GetMethodID(java_util_ArrayList, "size", "()I");
java_util_ArrayList_get = env->GetMethodID(java_util_ArrayList, "get", "(I)Ljava/lang/Object;");
java_util_ArrayList_add = env->GetMethodID(java_util_ArrayList, "add", "(Ljava/lang/Object;)V");
jint len = env->CallIntMethod(arrayList, java_util_ArrayList_size);
result.reserve(len);
for (jint i = 0; i < len; i++) {
jfloatArray element = static_cast<jfloatArray>(env->CallObjectMethod(arrayList,
java_util_ArrayList_get,
i));
const float *pchars = env->GetFloatArrayElements(element, nullptr);
result.emplace_back(pchars);
env->ReleaseFloatArrayElements(element, const_cast<jfloat *>(pchars), 0);
env->DeleteLocalRef(element);
}
}
jfloatArray cpp2java(array<float, 320> output) {
jfloatArray result;
result = env->NewFloatArray(320);
float *data;
data = output.data();
env->SetFloatArrayRegion(result, 0, 320, data);
free(data);
return result;
}
错误:
note: in instantiation of function template specialization 'std::__ndk1::vector<std::__ndk1::array<float, 320>, std::__ndk1::allocator<std::__ndk1::array<float, 320> > >::emplace_back<const float *&>' requested here
result.emplace_back(pchars);
^
我是 JNI Wrappers 开发的新手。我需要帮助将 ArrayList<float[]>
映射到 Vector<array<float,320>>
。
结果类型为:vector<array<float, 320>>
,通过引用传递。
然而你emplace_back
一个const float*
:
const float *pchars = env->GetFloatArrayElements(element, nullptr);
result.emplace_back(pchars);
您可以通过 pchar
指向的数据创建数组来解决问题,例如
std::array<float, 320> res;
for (int i = 0; i < end; ++i)
res[i] = pchars[i];
result.emplace_back(res);
确保范围检查pchar
(结束)您可能会越界访问。
您的向量包含 array<float, 320>
,但您传递给它的是 const float *
。您需要创建正确类型的数组并用适当的数据填充它。您绝不会创建 array<float, 320>
,也不会填充它。自从我使用 JNI 以来已经有一段时间了,所以我不太记得语法,但是您必须将 jfloatarray
中的元素复制到新的 array<float, 320>
中。
假设 pchars
包含适当的数据,那么您应该能够执行如下操作:
const float *pchars = env->GetFloatArrayElements(element, nullptr);
array<float, 320> newArray;
for ( size_t i = 0; i < 320; ++i ) newArray[i] = pchars[i];
result.emplace_back(newArray);
我有一个浮点数组的 ArrayList 作为 ArrayList<float[]>
,我想在 JniWrapper 中映射到 C++ Vector<array<float,size>>
。
我关注了这个link:
"Returning an arraylist of string from Native java to JNI"
并根据我的要求对代码进行了一些更改。
static jclass java_util_ArrayList;
static jmethodID java_util_ArrayList_;
jmethodID java_util_ArrayList_size;
jmethodID java_util_ArrayList_get;
jmethodID java_util_ArrayList_add;
static thread_local JNIEnv *env;
void java2cpp(jobject arrayList, vector<array<float, 320>> &result) {
java_util_ArrayList = static_cast<jclass>(env->NewGlobalRef(
env->FindClass("java/util/ArrayList")));
java_util_ArrayList_ = env->GetMethodID(java_util_ArrayList, "init", "(I)V");
java_util_ArrayList_size = env->GetMethodID(java_util_ArrayList, "size", "()I");
java_util_ArrayList_get = env->GetMethodID(java_util_ArrayList, "get", "(I)Ljava/lang/Object;");
java_util_ArrayList_add = env->GetMethodID(java_util_ArrayList, "add", "(Ljava/lang/Object;)V");
jint len = env->CallIntMethod(arrayList, java_util_ArrayList_size);
result.reserve(len);
for (jint i = 0; i < len; i++) {
jfloatArray element = static_cast<jfloatArray>(env->CallObjectMethod(arrayList,
java_util_ArrayList_get,
i));
const float *pchars = env->GetFloatArrayElements(element, nullptr);
result.emplace_back(pchars);
env->ReleaseFloatArrayElements(element, const_cast<jfloat *>(pchars), 0);
env->DeleteLocalRef(element);
}
}
jfloatArray cpp2java(array<float, 320> output) {
jfloatArray result;
result = env->NewFloatArray(320);
float *data;
data = output.data();
env->SetFloatArrayRegion(result, 0, 320, data);
free(data);
return result;
}
错误:
note: in instantiation of function template specialization 'std::__ndk1::vector<std::__ndk1::array<float, 320>, std::__ndk1::allocator<std::__ndk1::array<float, 320> > >::emplace_back<const float *&>' requested here
result.emplace_back(pchars);
^
我是 JNI Wrappers 开发的新手。我需要帮助将 ArrayList<float[]>
映射到 Vector<array<float,320>>
。
结果类型为:vector<array<float, 320>>
,通过引用传递。
然而你emplace_back
一个const float*
:
const float *pchars = env->GetFloatArrayElements(element, nullptr);
result.emplace_back(pchars);
您可以通过 pchar
指向的数据创建数组来解决问题,例如
std::array<float, 320> res;
for (int i = 0; i < end; ++i)
res[i] = pchars[i];
result.emplace_back(res);
确保范围检查pchar
(结束)您可能会越界访问。
您的向量包含 array<float, 320>
,但您传递给它的是 const float *
。您需要创建正确类型的数组并用适当的数据填充它。您绝不会创建 array<float, 320>
,也不会填充它。自从我使用 JNI 以来已经有一段时间了,所以我不太记得语法,但是您必须将 jfloatarray
中的元素复制到新的 array<float, 320>
中。
假设 pchars
包含适当的数据,那么您应该能够执行如下操作:
const float *pchars = env->GetFloatArrayElements(element, nullptr);
array<float, 320> newArray;
for ( size_t i = 0; i < 320; ++i ) newArray[i] = pchars[i];
result.emplace_back(newArray);