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

时间:2019-10-18 16:23:02

标签: java c++ java-native-interface jniwrapper

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

我点击了此链接:

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>>的帮助。

2 个答案:

答案 0 :(得分:0)

结果类型为:Response,通过引用传递。 但是您import * as express from 'express'; // import * as expressLib from 'express/lib' import { Request, Response, Application } from 'express'; const bodyParser = require('body-parser'); const cookieParser = require('cookie-parser'); import * as jwt from 'jsonwebtoken'; import * as fs from "fs"; const app: Application = express(); app.use(bodyParser.json()); app.route('api/login') .post(loginRoute); const RSA_PRIVATE_KEY = fs.readFileSync('/demos/private.key'); export function loginRoute(req: Request, res: Response) { const email = req.body.email, password = req.body.password; if (validateEmailAndPassword()) { const userId = findUserIdForEmail(email); const jwtBearerToken = jwt.sign({}, RSA_PRIVATE_KEY, { algorithm: 'RS256', expiresIn: 120, subject: userId }); // res.cookie("SESSIONID", jwtBearerToken, {httpOnly: true, secure: true}); res.status(300).json({ idToken: jwtBearerToken, expiresIn: "" }) } else { res.sendStatus(401); } } vector<array<float, 320>>

emplace_back

您可以通过根据const float*所指向的数据创建一个数组来解决该问题,例如

const float *pchars = env->GetFloatArrayElements(element, nullptr);
 result.emplace_back(pchars);

确保检查范围pchar(结束),您可能会超出范围。

答案 1 :(得分:0)

您的向量拥有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);