JNI中jfloatArray与jfloat*的相互转换

近期在写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;
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值