Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何映射Java ArrayList<;浮动[]>;到C++;向量<;数组<;浮子,尺寸>&燃气轮机;在JNIWRAPER? 我有一个浮动数组的数组,作为代码> > ARARYLIST/,我想映射到C++ >代码>向量“”_Java_C++_Java Native Interface_Jniwrapper - Fatal编程技术网

如何映射Java ArrayList<;浮动[]>;到C++;向量<;数组<;浮子,尺寸>&燃气轮机;在JNIWRAPER? 我有一个浮动数组的数组,作为代码> > ARARYLIST/,我想映射到C++ >代码>向量“”

如何映射Java ArrayList<;浮动[]>;到C++;向量<;数组<;浮子,尺寸>&燃气轮机;在JNIWRAPER? 我有一个浮动数组的数组,作为代码> > ARARYLIST/,我想映射到C++ >代码>向量“”,java,c++,java-native-interface,jniwrapper,Java,C++,Java Native Interface,Jniwrapper,并根据我的要求对代码进行了一些更改 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(jobj

并根据我的要求对代码进行了一些更改

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;

}
静态jclass java_util_ArrayList;
静态jmethodID java_util_ArrayList;
jmethodID java_util_ArrayList_size;
java_util_ArrayList_获取的jmethodo;
jmethodID java_util_ArrayList_add;
静态线程\u本地JNIEnv*env;
void java2cpp(作业对象数组列表、向量和结果){
java\u util\u ArrayList=static\u cast(env->NewGlobalRef(
env->FindClass(“java/util/ArrayList”);
java_util_ArrayList_uu=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\u util\u arrayList\u size);
结果:保留(len);
对于(jint i=0;iCallObjectMethod(arrayList,
java_util_ArrayList_get,
i) );
常量浮点*pchars=env->GetFloatArrayElements(元素,nullptr);
结果:安置后(pchars);
环境->释放浮动数组元素(元素,常量(pchars),0);
env->DeleteLocalRef(元素);
}
}
jfloatArray cpp2java(数组输出){
数组结果;
结果=env->NewFloatArray(320);
浮动*数据;
data=output.data();
env->SetFloatArrayRegion(结果,0320,数据);
免费(数据);
返回结果;
}
错误:

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);
           ^
注意:在函数模板专门化的实例化中,此处请求“std::\u ndk1::vector::emplace\u back”
结果:安置后(pchars);
^

我对JNI包装器的开发还不熟悉。我需要帮助将
ArrayList
映射到
Vector
结果的类型是:
Vector
,通过引用传递。 但是,您将
放置回
a
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);
std::array res;
对于(int i=0;i

确保范围检查
pchar
(结束)您可以访问越界。

您的向量包含
数组
,但您正在传递一个
常量浮点*
。您需要创建正确类型的数组,并用适当的数据填充它。在任何时候都不创建
数组
,也不填充它。我已经有一段时间没有使用JNI了,所以我真的不记得它了e语法,但必须将
jfloatarray
中的元素复制到新的
数组中

假设
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);
const float*pchars=env->GetFloatArrayElements(元素,nullptr);
数组newArray;
对于(size_t i=0;i<320;++i)newArray[i]=pchars[i];
结果:重新定位(新阵列);

你的向量包含
数组
但你正在传递一个
常量浮点*
。你需要创建正确类型的数组并用适当的数据填充它。嗨@ChrisMM,你能再解释一点吗?那我该怎么办呢…?好的,非常感谢。让我试试解决方法。@KhubaibAhmad“我的问题已经解决了。”“-那么你应该接受解决问题的答案,而不是留下“谢谢”的评论。@JesperJuhl,我向你道歉。。有一些技术问题,我无法做到。非常感谢@ChrisMM。我认为这是正确的解决办法。