JNI中jfloatArray与jfloat*的相互转换

本文详细介绍了如何在JNI编程中进行float数组到vector<float>的转换,并展示了如何将vector<float>逆向转换为jfloatArray。这些技术适用于其他类型数据的转换,适合JNI开发者参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

近期在写JNI时,本地native传入的数据类型是float[] xx,对应的jni的参数类型即为jfloatArray xx,那么如何读取jfloatArray xx中的数据呢,具体详见本人的实践代码部分“jfloatArray转vector<float>”。

         同时在JNI中本人还遇到需要将std::vector<float>类型的数据转为jfloatArray类型后作为返回值返回。该部分的实现详见本人实践代码部分“vector<float>转jfloatArray”。

        虽然本人提供的转换代码仅仅是float类型的数据,但是可以据此参考转换适用于其他类型的数据转换。

一、JNI中“jfloatArray转vector<float>”

extern "C"
JNIEXPORT jfloat JNICALL
Java_com_xxxx_xxxx_xxxx_GetScore(JNIEnv *env, jobject thiz,
                                                         jfloatArray feature1,
                                                         jfloatArray feature2) {
    // TODO: implement GetScore()
    jfloat* featureData1 = (jfloat*)env->GetFloatArrayElements(feature1, 0);
    jsize featureSize1 = env->GetArrayLength(feature1);
    jfloat* featureData2 = (jfloat*)env->GetFloatArrayElements(feature2, 0);
    jsize featureSize2 = env->GetArrayLength(feature2);
    std::vector<float> featureVector1(featureSize1), featureVector2(featureSize1);
    if(featureSize1 != featureSize2){
        return 0;
    }
 
    for(int i=0; i < featureSize1; i++){
        featureVector1.push_back(featureData1[i]);
        featureVector2.push_back(featureData2[i]);
    }
    float score = faceFeature->GetScore(featureVector1, featureVector2);
    return score;
}

二、JNI中“vector<float>转jfloatArray”

extern "C"
JNIEXPORT jfloatArray JNICALL
Java_com_xxxx_xxxx_xxxxx_GetFaceFeature(JNIEnv *env, jobject thiz,
                                                               jobject bitmap) {
    // TODO: implement ForwardFaceFeature()
    cv::Mat mat;
    BitmapToMatrix(env, bitmap, mat);
    if(mat.channels()==4){
        cv::cvtColor(mat, mat, CV_RGBA2BGR);
    }else{
        cv::cvtColor(mat, mat, CV_RGB2BGR);
    };
 
    if(mat.empty()){
        return nullptr;
    }
 
    std::vector<float> faceFeatureData{};
    std::vector<std::vector<cv::Point2f>> key_pts;
    std::vector<cv::Rect> faces = faceDetect->GetMaximumFace(mat, key_pts);
    if((faces.size()<1)){
        __android_log_print(ANDROID_LOG_DEBUG, "FaceFeature", "fail to detect face.");
        return nullptr;
    }
    std::vector<cv::Mat> norm_face = faceAlign->GetAlignedFace(mat, key_pts, false);
 
    // Extract Face Feature
    faceFeatureData = faceFeature->GetFeature(norm_face[0]);
 
    jfloatArray faceFeatureArray = env->NewFloatArray(faceFeatureData.size());
 
    env->SetFloatArrayRegion(faceFeatureArray, 0, faceFeatureData.size(), faceFeatureData.data());
    return faceFeatureArray;
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值