首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将Java ArrayList<float[]>映射到JniWrapper中的C++ Vector<array<float,size>>?

如何将Java ArrayList<float[]>映射到JniWrapper中的C++ Vector<array<float,size>>?
EN

Stack Overflow用户
提问于 2019-10-19 00:23:02
回答 2查看 211关注 0票数 0

我有一个浮点数组的ArrayList作为ArrayList<float[]>,我想将它映射到JniWrapper中的C++ Vector<array<float,size>>

我点击了这个链接:

"Returning an arraylist of string from Native java to JNI

并根据我的要求对代码做了一些修改。

代码语言:javascript
复制
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;

}

错误:

代码语言:javascript
复制
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包装器开发的新手。我需要帮助在映射ArrayList<float[]>Vector<array<float,320>>

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-19 00:33:02

结果的类型是:vector<array<float, 320>>,它是通过引用传递的。无论您如何emplace_back一个const float*

代码语言:javascript
复制
const float *pchars = env->GetFloatArrayElements(element, nullptr);
 result.emplace_back(pchars);

你可以通过在pchar指向的数据之外创建一个数组来解决这个问题。

代码语言:javascript
复制
std::array<float, 320> res;
for (int i = 0; i < end; ++i)
     res[i] = pchars[i];
result.emplace_back(res);

确保检查pchar (end)的范围,您可以访问的范围超出边界。

票数 0
EN

Stack Overflow用户

发布于 2019-10-19 00:34:28

您的向量包含array<float, 320>,但您传递给它的是一个const float *。您需要创建正确类型的数组,并用适当的数据填充它。无论何时,您都不能创建array<float, 320>,也不能填充它。我已经有一段时间没有使用array<float, 320>了,所以我不太记得它的语法了,但是你必须把这个JNI中的元素复制到一个新的JNI中。

假设pchars包含适当的数据,那么您应该能够执行以下操作:

代码语言:javascript
复制
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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58454764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档